Dreamforce 2009 Day 1: Prep

November 18, 2009 · Filed Under salesforce.com · Comment 

Good morning, all! As Dreamforce is this week, I’ll be sharing more frequently, updating after every major session and sharing code and config tips picked up during the conference. Salesforce.com was kind enough to give me a Blogger pass, so I may have access to some interesting news; I’ll be sure to share it here.
Last night was the Dreamforce 2009 Tweetup, organized by yours-truly and sponsored by Jon Mountjoy, Community Manager at Force.com and by Appirio, who has a booth in the Expo. A good time was had by all, as people who have only known each other via 140-character text snippets and cartoon-character avatars were able finally to meet.
The Salesforce Twitter community has evolved organically, coming into being without any intervention from salesforce.com, but the company has been quick to react, bringing many of its people into the Twittersphere under official Salesforce Twitter accounts such as @asksalesforce, @forcedotcom, and the like. This coincides with some super new offerings in the Service cloud over the past year (and to be announced at Dreamforce), and salesforce.com has said that one has fed into the other.
On a side note, kudos to salesforce.com for its responsiveness to its partner and customer communities, both via official (http://ideas.salesforce.com and http://www.salesforce.com/community) and unofficial (responding to blog posts and emails) channels.
Joining me in the press room are Jeff Grosse of www.crmfyi.com and www.salesforcechannel.com and John Rotenstein of www.theenforcer.net. We’re prepping for the press briefing, which starts shortly. We’ll all be sure to share what we learn as we learn it.

And to all the tweeters out there, don’t forget to use #df09 and #forcedotcom!

SugarCRM: Shenanigans!

November 18, 2009 · Filed Under salesforce.com · 1 Comment 

This morning I was greeted by this email from SugarCRM (actually two emails):

Dear David
Marc Benioff has a few zingers for SugarCRM in his new book Behind the Cloud:
“We knew that we had truly emerged as the market leader in the eyes of the industry when we arrived at Dreamforce 2006 to find that a handful of employees from a small CRM company had set up a mock protest outside the convention center. I’m not really sure what they were protesting, and it was a small, low-budget, and poorly executed rip-off of the types of tactics we had invented, but that wasn’t the point. The point was that we knew not to get ruffled.” - Page 65 of Behind the Cloud by Marc Benioff, Chairman and CEO of Salesforce.com.
SugarCRM is sorry they disappointed Marc during their first visit to Dreamforce in 2006. Marc even challenged them to “step up the innovation”:
“We did not want this company to get free PR on our coattails! Ignoring this escapade worked well. A blogger asked a Dreamforce attendee if she had seen what was going on outside when she arrived, and she replied that it must have been some kind of Salesforce.com stunt. (Note: if you are going to compete with someone at his or her own game, always remember to step up the innovation.)” - Page 65 of “Behind the Cloud” by Marc Benioff, Chairman and CEO of Salesforce.com
Marc was right. Game on.
In continuing its long love affair with the industry’s most down-to-earth CEO and its commitment to staging “small, low-budget, and poorly executed rip-off [tactics]”, SugarCRM is currently distributing 1,000 copies of “Behind the Smokescreen: The Untold Story of How Salesforce.com Still Manages to Sell 1999 technology 10 years later” at Dreamforce today.
With an endorsement from North Korean leader Kim Jong II (“A great guide for any entrepreneur, CEO, or Head of State looking to promote openness and freedom”), Behind the Smokescreen is a response to the magical Salesforce.com marketing that has transformed the company’s service from .com ASP to On-Demand SaaS to Cloud Computing without changing its architecture

[note: the version of this email from Chris Harrick of "The Sugar Team" says, "to Cloud Computing without being apple to run its service on Amazon EC2, Microsoft Azure or other cloud services." - Hey Chris, those are other platforms. Salesforce is NOT SUPPOSED TO RUN on those. But it could integrate quite well!]
You can read the full book here: www.sugarcrm.com/smokescreen.
To celebrate the release of the book, SugarCRM is offering a free data migration for Salesforce.com users through the end of the year. Registrants will have a chance to win a free Motorola Droid.
SugarCRM hopes that the publication of this book “step[s] up the innovation” in Marc’s eyes. Please let us know if you’d like to speak with someone from SugarCRM about this campaign.
Regards,
Lisa Holden on behalf of The SugarCRM Team
(415) 817-2509
lholden@schwartz-pr.com

I’m not sure what they’re trying to do, but they’re certainly not making it look like they’re worth my time. The Kim Jong Il joke is pathetic (though a deeper look at the text shows that it’s actually “Kim Jong II” – as in Kim Jong the Second) and there is at least one blatantly inflammatory remark:
Here’s a tip for SugarCRM: Salesforce CRM and the Force.com Platform are NOT SUPPOSED to run on Amazon SC2 nor Microsoft Azure!
To be fair, since Benioff is well-known for his demonstrations outside Oracle OpenWorld a few years ago (his own demonstration to which he alludes in his page 65 quote), SugarCRM’s tactic is understandable – but hopefully our Fearless Forceful Leader takes this more as a compliment (imitation and flattery and what-not) than an attack.
That’s all. No need to pick up a physical copy of the book – it’s available for download. In fact, I propose that someone host a copy on another site for download so that SugarCRM believes that far fewer people have downloaded the file.
Back to your regularly-scheduled Dreamforce programming.

Dreamforce Starting Today

November 17, 2009 · Filed Under salesforce.com · Comment 

This year, I’ve been given a Blogger pass to Dreamforce, so I’ll be reporting on happenings fairly regularly. Stay tuned for news, stories, and tips. I’m also planning to post any interesting code from the various developer sessions, so stay tuned!
And for my fellow tweeters and bloggers, come to the Dreamforce 2009 Tweetup at 6pm in the Dev Zone Force.com Theater.

Trigger to help Salesforce for Twitter

October 6, 2009 · Filed Under salesforce.com · 1 Comment 

Salesforce for Twitter is one of the best AppExchange packages I've seen. It fulfills the promise salesforce.com made to bring the Service Cloud to all orgs of all sizes. And it works well.

Though a supplemental/unofficial guide to customizing SFDC for Twitter will be released soon on this site, I wanted to share a trigger I just wrote to add new Leads to a campaign:

Firstly, thank you to Scott Hemmeter at Arrowpointe, who wrote the original code that I customized.

Secondly, you could easily duplicate this trigger and set it to run on the Contact object as well.

Please don't set the trigger to "after update," as in testing, it ran into problems when converting a Lead and merging with a Contact already on the "Twitter" campaign.

trigger AddToTwitterCampaign on Lead (after insert) {

    // List containing each Lead being processed
    list<Lead> theLeads = new list<Lead>(); 
      
    //We only execute if we have a campaign named "Twitter"

    if([SELECT Count() FROM Campaign WHERE name = 'Twitter'] == 1){
        Campaign TC = [SELECT id, name FROM Campaign WHERE name = 'Twitter' LIMIT 1];
        
        for(Lead l:trigger.new) { 
            if (l.leadsource.indexOf('Twitter',0 ) >= 0 ||  l.leadsource.indexOf('Tweet',0 ) >= 0 ){  
                theLeads.add(l); // add lead to the main lead list
                }
            }
      
      // List containing Campaign Member records to be inserted
      list <CampaignMember> theCampaignMembers = new list<CampaignMember>(); 
    
      for (Lead ld:theLeads) {
          CampaignMember cml = new CampaignMember();
          cml.leadid = ld.id;
          cml.campaignid = TC.id;
          theCampaignMembers.add(cml);
        }

     //Insert the list of Campaign Members
      if(!theCampaignMembers.isEmpty()){
        insert theCampaignMembers;
        }
    }
}

The trigger requires that you have a Campaign called "Twitter," but feel free to change that to anything else you'd like.

Don't worry if you have other triggers that add Leads to Campaigns - this can work alongside them, so you can add Leads to as many Campaigns as you'd like.

Filtered Lookups, Validation Rules, and Order of Execution

Reading the cheatsheet for Filtered Lookup (beta), I noticed an interesting line:

Lookup filters function similarly to validation rules when you save a record. That is, actions that cause related records to save, such as changes to a roll-up summary fields, also trigger the lookup filters on the related record and block the save.

The implications for this are massive. Let's explore two examples:

Example 1: Filter as Validation Rule from Parent Record

  • We create a lookup on a Child object to Parent.
  • We filter the lookup to EXCLUDE Parent.Status = 'Closed' (Parent.Status is only Open or Closed.)
  • We can edit the Child records as long as the Parent Status is not Closed.
  • When Parent.Status is changed to Closed, existing related Child records are not affected...
  • BUT if we attempt to edit a Child when the Parent is Closed, Force.com will throw an error (which we can customize) beause that the Lookup is invalid.
  • (and clearly we cannot add new Child records either)

Conclusion: Thus, Filtered Lookups act much like Validation Rules. A quick experiment shows that Filtered Lookup errors actually fire before Validation Rules.

Example 2: Filter as Validation Rule on Roll-Up Summary (from Child Record) - what the line above was referencing

  • Use the above example, but change the lookup to a master-detail relationship
  • Create a Roll-Up Summary field to count all child records
  • Prevent saving more than 10 child records for one parent record

Here, we have triggered a filter error without touching a parent record, yet we throw an error based on a value on the parent record.

This second example is significant because we could already prevent more than 10 child records from saving, but doing so required a Roll-Up Summary field on the parent object AND a Validation Rule on the child object. Now we can replace the Validation Rule with the Lookup Filter, though we still need the Roll-Up Summary field. Whether or not this simplifies things is definitely up for debate...

Conclusion

This is a very powerful feature! Thanks to salesforce.com for rolling it out, even in beta form.

Real world example: The above example would be great for Time Sheet Entry and Time Sheet Header objects, as they would create, in effect, a validation rule on the Header record preventing editing of any child records. Awesome!

For further reading, check Salesforce Help's Lookup Filters examples.

« Previous PageNext Page »