Wednesday, November 11, 2015

Salesforce AJAX Toolkit update call fails *silently* with field access issue

Some simple button code with Salesforce Ajax Toolkit (connection.js) to send a lead to queue (and related assignment logic in Apex):

var updateRecord = new Array();
var myquery = "SELECT Id, CompleteOwner__c FROM Lead WHERE Id = '{!Lead.Id}' limit 1";

var result = sforce.connection.query(myquery);
var records = result.getArray("records");

if (records[0] && (records[0].CompleteOwner__c === undefined || records[0].CompleteOwner__c === null)) {
    var update_lead = records[0];

        update_lead.OwnerId = "{!$Setup.CompleteQId__c.Id__c}"; /* To complete Q */

        var callback = {onSuccess: updated, onFailure: failed}
        sforce.connection.update(updateRecord, callback);
The trouble is, the update call returned successfully, but update didn't happen at all - I couldn't even capture the API call with a debug log.

It turns out the trouble is the CompleteOwner__c field.  If that's taken out, the code works fine.  The user has no write permission to the field, but, the code isn't updating it either.  Apparently merely having that field member in the record data structure prevents the update from taking place, without any failure message.  Changing the highlighted part to this, which uses an new object for update without that field member, fixed the problem.
var update_lead = new sforce.SObject("Lead"); //can't use query result for update = "{!Lead.Id}";

update_lead.OwnerId = "{!$Setup.CompleteQId__c.Id__c}"; /* To complete Q */
 The frustrating part is the silent failure.  Why not just fail the call when there's a non-writeable (by permission) field? 

Tuesday, June 16, 2015

Biometrics Software is not Working with PGP Desktop

That's the title of a Symantec KB article. It's true.  I got the biometrics software from Broadcom, which is supplied by Dell for their fingerprint reader on Latitude E6230.  Following the instructions here after a system rebuild due to a bad BSOD, I was able to get the biometrics set up and working (seemingly), or so I thought.  Then it broke down.  What happened was, when a fingerprint was scanned correctly, the fingerprint icon just disappeared from the login screen without letting me in.  It's almost hilarious.  So, having a full-disk encryption for now prevents me from using fingerprint as authentication. 

What's worth mentioning is that, before I had the fingerprint setup working, then had full-disk encryption retrofitted in, the fingerprint setup stayed working.  This time around encryption is in first, and they could no longer work together.

Monday, June 15, 2015

Recovering workspaces: Eclipse vs Sublime Text

My PC's OS had to be reinstalled recently, so I had to get my IDE in order before starting to work again on  Eclipse has always been pretty easy - both my binary and workspaces were covered by Box Sync, so it took almost no effort.  Once everything was sync'd back, I could simply run Eclipse and point it to the right workspace.

MavensMate on Sublime wasn't nearly as easy.  First I had to reinstall Sublime (3) + MavensMate (4.0.5), which wasn't too bad.  After that I edited MM's setting to use the correct workspace, which got all my projects back.  However, none of them actually worked anymore.  The context menus were just gone.  Not wanting to spend time on figuring out what's wrong, I just went ahead recreate the projects.  No a huge deal, but kinda annoying.

Friday, January 16, 2015

Enable Visualforce pages for Salesforce1

It's a fairly simple process.  Barring any unsupported stuff on the VF, it should just work.  However I've run in a timeout issue on more than one occasions - clicking on Save ended with a timeout page and the change was never saved.  Had no idea why and didn't have the patience to open a case with Salesforce, so I took the developer route.

Here's how you can work around it if you can use developer tools (or any Metadata API enabled tool for that matter).  The enablement switch is implemented as this availableInTouch field on the ApexPage object.  All is needed is to flip it to true.  For instance if you have Eclipse, you'll notice the field as a member in the page-meta.xml file.

 <?xml version="1.0" encoding="UTF-8"?>  
 <ApexPage xmlns="">  

Quick code formatting provided by Source Code Formatter

Once flipped, save it (remember to Save to Server, as Eclipse doesn't build it to server for meta files) and you're all set.  Similarly this can be done with Ant as well.

Please note the field is only available API 27 or later, so make sure the tool connects using supported API versions.

Thursday, October 30, 2014

Can't be portable with MavensMate

I wanted to try MavensMate. IDE is like this comfort food you can't live without, but you started to wonder whether there's a better dish to keep you healthy.

So after thinking about it for quite some time, I finally got around to actually do it today.  I don't have a Mac, but MM should work for Windows too.  I downloaded Sublime Text and MavensMate, followed the instructions (solved some little issues along the way), and ... it didn't work.  "New Project" from the menu did absolutely nothing.  So I opened the console in Sublime and noticed the error message about needing mm_workspace information.  Eventually I found the issue - basically the portable version of Sublime Text does NOT work for MavensMate on Windows, because MM would be at a loss when it needs to find the settings file.  I couldn't figure out where the file is to modify as suggested on the Github issue page (maybe because I'm using the x64 version of ST3) so I just reinstalled Sublime with the regular Windows installer, and things started to work.

Overall the first step for adopting MavensMate was a bit more involved than I expected. It's a young tool - I told myself.

Tuesday, August 5, 2014

Skeleton code for Batchable/Schedulable classes

I wish IDE had a quick option to generate a skeleton class for Batchable classes.  It has one for test classes, so why not this one?  For now I just paste in my own skeleton code to save typing the same stuff every time.
global class BatchableSample implements Database.Batchable, Schedulable { global Database.Querylocator start(Database.BatchableContext context) { // TO-DO: construct the actual query return Database.getQuerylocator([Select Id From Account Where CreatedDate = TODAY]); } global void execute(Database.BatchableContext context, List scope) { } global void finish(Database.BatchableContext context) { }

// schedulable global void execute(SchedulableContext context) { } }

Friday, August 1, 2014

Salesforce connected apps settings are not copied to sandbox

So for me this was learned first in practice, then confirmed by Salesforce knowledge base article 194090.  When a sandbox is created/refreshed, custom connected apps configured in production will be not be copied, even though they're part of the configuration/metadata.  This is true for full sandboxes as well.  The standard connected apps (Salesforce1, Chatter Desktop, etc.) will obviously still be there.

The KB article also pointed out that you can't reuse the same API name when you recreate the apps.  It's probably the result of this known issue.

These oddities combined with the still confusing UX with connected apps - create in one place (Create > Apps) and edit in another (Manage Apps > Connected Apps) made Connected Apps still feel like a beta feature.