RSS feed for blog Linkin Skype Mail Me Twitter


Click for Full Blog Listing

Missing A Conference

Over the last few weeks my social media stream has been filled with pictures and memories of times gone by for Lotusphere/Connect, these memories have been more than a little bit painful as they were all great times, a meeting time for great friends as well as for a community spirit that I’ve never met in any other technology, not Salesforce, nor Java, node or MongoDB,

This community still does exist even though it has shrunk over the last couple of years, however there is hope that with the recent changes and the hopeful reinvigoration by IBM/HCL as well as the constant work of such core community leaders of Gabriella Davis that it will return and maybe even grow, having basically opted out of the community for the last year or so through a mixture of client demands and ever-increasing work load, I am now reminded by these pictures and memories how important such a community is and not just to work and to business but to friendship and general sanity,

Long live the yellow bubble!!!

Missing a Conference 04

—^ My First Lotusphere, young fresh-faced and not fat

Missing a Conference 03

—^ Presenting for the first time at Lotusphere

Missing a Conference 01

—^ On the Piss with good friends

Missing a Conference 02

—^ The famous “all bloggers” photo

Salesforce: Same Code Different Triggers

In Salesforce the same bit of code can be triggered a lot of different ways and with calls to third parties there are different rules for the different ways of calling stuff.

For example take this bit of code, in it we are just passing a contact ID and it is going to go and talk to a third party web service, inside the “setUpRequest” it’s going to update the third party with the details of the Salesforce Contact and in return recive some bits and bobs from the third party to update the Saleforce side. Basic syncing between two parties

public class BlogFramework {

    public Static Void UpdateContactFromExternalWebService(String contactID) {
                Http h = new Http();
                HttpRequest request = setUpRequest(contactID);
                HttpResponse response = h.send(request);


we want this thing to happen at two different times:

  1. When a user manually updates a contact and then just saves it: we want the sync to happen instantly so the user can see immediately what’s happened and what’s been updated.
  2. On schedule: The content might not be updated in Salesforce at all, all changes might happen in the third party but the details still have to be kept up to date for reports and views etc.

So this bit of code has to be callable both from a Schedule and from a save Trigger

let’s take the save trigger first, as it is now it won’t work, you will get the error “Callout from triggers are currently not supported.” error if you try, normally you would just pop the annotation “@Future(callout=true)”1 at the top of this function and that would solve that but as you will see later on we can’t do that so what we’re going to do is have a little wrapper function that has the @future annotation and from that it’s going to call are real function.

public Static Void UpdateContactFromExternalWebServiceTrigger(String contactID) {

we can then put that wrapper functions in our contact save trigger and everything will work perfectly

trigger ContactTriggerAllEvents on Contact (
    before insert,
    before update,
    //before delete,
    after insert,
    after update
    //after delete,
    //after undelete

Next comes calling it from a schedule, if we had put the @future annotation on the actual function this would fail because you cannot call a future function from a scheduled action but we dont have that issue now, what you DO have to do is bolt-on the “Database.AllowsCallouts” to your batch object as seen below

global class UpdateFromAzpiral implements Database.Batchable<sObject>, Database.AllowsCallouts{

    // Get all the contacts
    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator([SELECT Id FROM Contact]);

    // The executeBatch method is called for each chunk of objects returned from the start function.
    global void execute(Database.BatchableContext BC, List<Contact> scope){
      for(Contact c : scope){

    //The finish method is called at the end of a sharing recalculation.
    global void finish(Database.BatchableContext BC){


Now your batch object will be allowed to do callouts.

Putting all these bits together means you can have a single function that calls out to third parties that can be triggered from either a Schedule or an ordinary Trigger.

  1. The “@Future(callout=true)” annotation basically means that the salesforce code does not stop and wait before doing other things this means that calls to third parties does not slow down the salesforce UI. 

A Year in Review 2017

Year In Review 2017

So here comes the year in review blog post

I think it’s fair to say that I’ve never had a year that’s been so head down teeth gritted

Most of what would be considered the fluff or interesting things that you do in a year has been missing entirely, no conferences, no training courses, no anything other than client work. that is not to say I haven’t done new things, each week, each month seems filled with new technology, new things to code, new things to learn but it’s all been work that has to be delivered, work that has to be produced on time.

This resulted in the company itself doing well and thanks to that I’m in a better position then I think I’ve ever been before, a state that is all for the good because what with Brexit happening soon, UK companies now face an uncertain future so using the next two years to prepare for that is something that is going to be really important

Looking forward to the coming year it looks as if I have finally reached a point in my career progression where I do not have a major on-site client, all of my work can be done remotely which is a goal I’ve been aiming for some time but it’s still a little bit stunning to finally reach it, it will mean I need even more focus in how I work and that will give me a couple of extra blog posts as I formalise the way I behave on a day to day basis but I finally have the flexibility I’ve been after.

It’s always good to look back in the year and try and update your CV, what are you an expert in? what can you sell yourself as? what you are aiming for going forward? To be frank, knowing technology by rote plays less and less a part of what I provide my clients (both LDC and None LDC).

What I’m good at is learning new1 things, in adapting and providing clients with what they want when they want, the stuff that I’ve been hired to do going forward this year and stuff that I’ve been doing for the last 8 months at least hasn’t really been solely technologically orientated no one has said “oh are you an expert in x” they have just hired me to solve a problem, to make an issue go away, how that is done has been irrelevant or has already been set in stone by corporate decision.

However, I wouldn’t be me unless I still loved new technology and rolled in it like freshly cut grass.

  1. Javascript frameworks: Javascript is still the internet darling it has been for the last couple of years, but the frameworks come so fast that I now just poke my nose in each one that passes to see if it does anything groundbreaking or if it genuinely replaces one I am currently using.

  2. Networks and encryption: This has been an odd one to go back to and get up to date with, so many of the solutions I have had to provide this year have not been code related, or rather code has not been the best way to solve the problem, hardware and network performance issues don’t just go away with platform as a service if anything they get more complex as they are not as transparent.

  3. Salesforce offshoots: Salesforce continues to keep buying things and integrating them into their ecosystem so things like AMPScript have become commonplace.

But there have been losses and this year I lost my IBM champion status, there was the brief pang of “Bugger”, but writing this I can’t say I disagree with the decision, I did no conferences this year2, and thus no speaking gigs, this blog was very quiet on the IBM front, and all the stuff I did for IBM was behind the scenes at client sites and a Champion really does have to be seen …. C’est la vie


What do I think I will be doing in 2018?

  1. Practical Cloud - The cloud has changed so many things and made them better, but in some ways we have gone backwards and there is a lot of work in such regressions, for example, inter-machine network speed that had reached really rather fast rates on internal networks has suddenly tanked when it is measured between existing onside stuff and new cloud services.

  2. Hard Decisions - Over the last year, I have seen a growing trend of business actually having the budget and gritting their teeth over modernizing apps that have been around for 10+ years.

  3. Security - Even things that have been trusted for years have failed in the last 12 months, and while there are lots of security people around that will load up your network and apps with new standards and firewalls, there does not seem to be anyone that is willing to fix the trashed performance when the heavy boots of the security forces have been in and done their work.

I suspect quite a lot of my year will be spent using both new and old tech to get things working again after someone has enacted the latest company edict……. :)

  1. And by “New” I just mean new to me. 

  2. LotusSphere/IBM Connect/IBM Think was in direct conflict with a client delivery, I’m not travelling to the US unless I have to for personal reasons so that cuts out the regional US conferences, UKICON was cancelled and I screwed up my passport for Engage 

Click for Full Blog Listing
Latest Blogs