Salesforce Chatter for Android

June 6th, 2010

My blog has been a little quiet since I left for Google IO a few weeks ago and this is primarily the reason why. In addition to my day job I’ve been working on getting up-to-speed on Android development. Google sent me a Droid about a month before the conference and I started playing around with some tutorials and writing a few apps before IO (smart idea to send out 5K Droids to spur development). I really caught the Android bug at the event and thought that the Chatter Developer Challenge would be a great way to kill two birds with the proverbial one stone.

So here is the demo of the application that I just submitted for the Chatter Developer Challenge. It is a Salesforce Chatter for Android app running on a combination of the Force.com platform, Google App Engine and a Google Android mobile handset. It utilizes Force.com Remote Access Applications with 3-legged OAuth for security. The Android application has the following functionality:

  • Display your Chatter NewsFeed
  • Update your User status
  • Refresh your Chatter NewsFeed and store it in the local SQLite database
  • Choose a project (custom object) that you are following and view its Chatter Feed
  • Update the project’s status
  • Refresh the Chatter Feed for the project (including field changes to the record) and store it in the local SQLite database

The app does not include the functionality to reply to posts. Since Chatter is running in a Developer Edition and they are only allowed to have 1 user, it seemed rather pointless to respond to my own posts.

Here are some screenshots of the application in case you want to skip the video.

I use Google App Engine to tie all of this applications together and provide a coherent security model. So I wrote a small App Engine app that uses OAuth to authorize access to Force.com and my Chatter feeds using Force.com Remote Access Application. Once authorized the Force.com Web Services Connector, running on App Engine, performs the interactions with SFDC such as submitting new status updates, fetching my feeds and displaying them as JSON objects.

App Engine recently started supporting 2-legged OAuth in combination with Google Accounts so that any App Engine application can become an OAuth service provider. Since OAuth support is baked into the Android platform I tried to hook up the Android handset as an OAuth consumer but could not finish in time to submit my entry to the Developer Challenge.


Since Android doesn’t play well with SOAP-based Web Services I think this approach in combination with JSON makes an appealing option. If you have any ideas, I’d love to hear them. I expect to write some more apps for Salesforce.com as the Android platform is fairly easy to grok. If you are familiar with using Eclipse with Force.com, App Engine, GWT or Java in general it seems much faster to get an app up and running with Android than with Objective-C for the iPhone. Just my $.02.


VN:F [1.9.3_1094]
Rating: 6.7/10 (3 votes cast)
VN:F [1.9.3_1094]
Rating: +2 (from 2 votes)

Categories: Android, Cloud Computing, Google App Engine, Java, Salesforce, Technology

3 Comments

WaveMaker’s IDE for the Cloud

June 4th, 2010

Yesterday at Appirio we had a private demo of the WaveMaker platform from the guys at WaveMaker. I’ll try to recap most of the things that I heard as it pertains to Salesforce.com and vmforce but for more details you’ll want to check out their website.

The WaveMaker platform allows you to build applications that are portable across cloud environments. WaveMaker’s rapid application development platform consists of two products:

  • WaveMaker Studio: a visual, drag & drop development tool that runs in a browser and can be installed on a desktop or accessed via the cloud.
  • WaveMaker Server: a Java framework that provides security and data management, runs in any Java server and deploys on-site or in the cloud

The WaveMaker Studio is a pretty slick drag-n-drop interface with live previews of data for bound widgets. You can consume Web Services, database schemas and Java services to automatically generate boilerplate code for you. On the frontend it generates Dojo widgets and Spring and Hibernate components for the backend. It essentially spits out a standard Spring application that will run in any standard J2EE environment.

Development features include:

  • Drag & drop application assembly
  • One-click database import
  • One-click CRUD data forms
  • One-click related data forms
  • Live data preview within studio
  • Single sign-on security
  • Role-based access controls
  • Rich entry field validation
  • Built-in data grid pagination
  • Auto-complete search boxes

So how does this related to Salesforce.com? They are working for a release in July that supports the Force.com platform and will run on VMforce. They can consume the Enterprise WSDL and generate a standard front and back end components that you can import into Eclipse and start customizing. Their goal is to treat Salesforce just like any other database. However they are trying to build in some platform logic such as governor and limits based up the running edition. These java apps can then be deployed to EC2 and VMforce.


If you are interested, there is a free, community edition you can get started with right away. I’m not sure of the pricing for their enterprise or cloud editions so you’ll want to check with them if they have a seat and/or runtime license before you invest too much time.

Some other interesting points from yesterday’s meeting:

  • Web Fast: with WaveMaker’s visual tools, any developer can start building enterprise Java applications with minimal training.
  • CIO Safe: WaveMaker creates standard Java applications, boosting developer productivity and quality without compromising flexibility.
  • Cloud Ready: WaveMaker enables one-click deployment of rich internet applications to on-site or cloud hosting.
  • Cuts Java learning curve 92%: College grads can build Java web apps in 2 months versus 2 years
  • Reduces code 98%: Migrated .NET app with 26K lines of code to WaveMaker with 335 lines.
  • Slashes maintenance 75%: Self-service for call center app eliminates 75% of maintenance costs


VN:F [1.9.3_1094]
Rating: 7.5/10 (4 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Amazon EC2, Cloud Computing, Java, VMforce

No Comments

Testing Salesforce.com Controller Extensions

June 2nd, 2010

One thing that salesforce.com is working on is providing developers with a better testing environment. Salesforce.com requires you to write test cases to deploy your code to production but sometimes the process can be painful. Given the lack of something like jUnit you have to implement your own setup and test procedures. You’ll need to create all of your test records and test each scenario to ensure your code performs as expected.

Here’s a small test class for a controller extension using some techniques from Jason Ouellette’s book Development with the Force.com Platform. BTW… if you don’t have a copy of this book, get it! It’s invaluable!

I’ve sanitized the code for your protection but essentially the controller code involves reassigning objects with a master-detail relationship. I didn’t include the actual controller but that’s not what is important here. The use case is you have an master record with three detail records and you want to create a new master record and move some of the details records to the new record.

The test class involves a static initializer, a shared init method and two test methods. The static initializer runs the code to perform tasks such as setting up profiles, creating users, deleting data, etc. This is where you essentially setup your test environment. The init method is called by each test method and sets up the required data for that method plus runs any shared code. Each test method then runs different scenarios to complete your code coverage.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@isTest
private class Test_MyControllerExtension {
 
  static MyController ext;
  static MasterObject__c masterObject;
  static PageReference pref;
  static User testUser;
 
  static {
 
    Profile p = [select id from profile where name='Some Profile'];
 
    testUser = new User(alias = 'u1', email='u1@testorg.com',
      emailencodingkey='UTF-8', lastname='Testing', languagelocalekey='en_US',
      localesidkey='en_US', profileid = p.Id, country='United States',
      timezonesidkey='America/Los_Angeles', username='u1@testorg.com');
 
    insert testUser;
 
  }
 
  private static void init() {
 
    masterObject = new MasterObject__c(Name='Test Object 1');
    insert masterObject;
 
    DetailObject__c d1 = new DetailObject__c(
		Name='Detail 1',Status__c='Open',MasterObject__c=masterObject.Id);
    DetailObject__c d2 = new DetailObject__c(
		Name='Detail 2',Status__c='Closed',MasterObject__c=masterObject.Id);
    DetailObject__c d3 = new DetailObject__c(
		Name='Detail 3',Status__c='Declined',MasterObject__c=masterObject.Id);
 
    List<DetailObject__c> children = new List<DetailObject__c>();
    children.add(d1);
    children.add(d2);
    children.add(d3);
    insert children;
 
    pref = Page.MoveRecords;
    pref.getParameters().put('id',masterObject.id);
    Test.setCurrentPage(pref);
 
    ApexPages.StandardController con = new ApexPages.StandardController(masterObject);
    ext = new MyController(con);
 
  }
 
  static testMethod void testMoveOpenOnly() {
 
    init();
 
    Test.startTest();
 
    // choose the owner of the new master object
    ext.testUserId = testUser.Id;           
    // indicate that we want to move the closed children
    ext.moveClosed = true;
 
    // perform some more assertions
 
    pref = ext.save();
    System.assertEquals(pref.getUrl(),'/'+ext.newMasterObject.Id);
 
    // ensure the original master object contains 1 child
    System.assertEquals(1, [select count() from DetailObject__c where MasterObject__c = :masterObject.Id]);
    // ensure the new master object contains 2 children
    System.assertEquals(2, [select count() from DetailObject__c where MasterObject__c = :ext.newMasterObject.id]);
 
    Test.stopTest();
 
  }
 
  static testMethod void testDoNotReassignDeclined() {
 
    init();
 
    Test.startTest();
 
    // choose the owner of the newmaster object
    ext.salesRepId = salesRep.Id;         
    // indicate that we do NOT want to move the closed children
    ext.moveClosed = false;
 
    // perform some more assertions
 
    pref = ext.save();
    System.assertEquals(pref.getUrl(),'/'+ext.newMasterObject.Id);
 
    // ensure the original master object contains 2 children
    System.assertEquals(2, [select count() from DetailObject__c where MasterObject__c = :masterObject.Id]);
    // ensure the new master object contains 1 child
    System.assertEquals(1, [select count() from DetailObject__c where MasterObject__c = :ext.newMasterObject.id]);
 
    Test.stopTest();
 
  }
 
}
VN:F [1.9.3_1094]
Rating: 8.0/10 (1 vote cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Apex, Code Sample, Salesforce

1 Comment

Google I/O 2010 Recap

May 24th, 2010

I’m back from Google I/O 2010 in San Francisco and am finally able to take a breath. There were over 5,000 developers, 90+ technical sessions, over 180 companies peddling their tech in the Sandbox and a steady stream of product and technology announcements. It was two action-packed days of deep technical content featuring Android, Google Chrome, Google APIs, GWT, App Engine, open web technologies and much, much more. I’m so glad to be working in the cloud with all of this new crap to play with! Here’s a short list of things that stuck out the most for me.

Vic Gundotra (Vice President, Engineering) stated that “I/O” represented “Innovation” and “Openness” and that was the theme throughout the two day event. Google relentlessly bashed Apple for their stance on a number of issues (no Flash, AT&T only, policed App Store, etc) and cemented their “kumbayah” of inclusiveness and standards. Google drove home their support for HTML5, Flash and a new open-source, royalty-free video format called WebM.

The Day 2 Keynote was awesome! One of the most riveting keynotes I’ve ever seen. You’ll definitely want to watch the video below.

Android, Android and more Android
This might have well been called the “Android Developer’s Conference” as most of the emphasis was on their mobile platform. I have to admit that they didn’t disappoint. All of Android sessions and labs were packed and some even turned away people. I attended a couple of hacker sessions including development best practices, game development and building REST clients.

Last year Google gave every attendee a Nexus One at the event. This year they were smart and shipped everyone a Nexus One or Droid a month before the event to help them get up and running on the Android platform. Then, to everyone’s surprise, they gave everyone on day 2 another Android device; the Sprint HTC EVO that ships next month. I’m seriously in love with this phone and am considering giving up my iPhone.

The major announcement was the release of Android 2.2 Froyo (Frozen Yogurt). Some of the highlight include:

  • 2-5x speed increase with devices running the Dalvik just-in-time (JIT) compiler
  • 2-3x browser speed improvement with the Chrome V8 engine
  • Support for Microsoft Exchange
  • Flash support
  • Tethering and Portable Hotspot
  • App Storage on SD -- run app directly from the SD card
  • Update All and Auto-update for applications

App Engine for Business
After two years, Google finally announced a service target specifically at small businesses. The service adds management and support features tailored specifically for the enterprise allowing them to take advantage of the core benefits of Google App Engine: easy development using familiar languages (Java and Python); simple administration, with no need to worry about hardware, patches or backups; and effortless scalability. However, some of the details, especially pricing, were fuzzy. My favorite was announced support for SQL databases (presumably MySQL).

  • Centralized administration: A new, company-focused administration console lets companies manage all the applications in their domain.
  • Reliability and support: 99.9% uptime service level agreement, with premium developer support available.
  • Secure by default: Only users from the Google Apps domain can access applications and corporate security policies are enforced on every app.
  • Pricing that makes sense: Each application costs just $8 per user, per month up to a maximum of $1000 a month. This is the part I didn’t quite understand as it must be for non-domain users.
  • Enterprise features: Coming later this year, hosted SQL databases, SSL on the company’s domain for secure communications, and access to advanced Google services.

Google Wave
Over the last number of months the Wave team has made a number of enhancements to the service. They’ve added an extensions gallery, Robots API v2, Active Robot API and an anonymous read-only access for embedded waves. They made the statement in a number of sessions that if you tried Wave in the past to please come back and take a look at Wave now given the number of enhancements. Google also went so far as to make Wave available for Google Apps (Standard, Premier and Education Editions). Some features announced at I/O include:

  • Run robots on any server — not just App Engine. They also announced that you can program robots in Google Go.
  • Use a robot to manipulate and retrieve attachments within a wave
  • Use the “Wave This” service to let your website’s visitors easily create waves out of the content on your site.
  • Fetch waves on behalf of users with Wave data APIs

Google Web Toolkit
GWT sessions were quite numerous and popular and the Day 1 keynote revealed some exciting new features. VMware and Google announced a collaboration centered around the Spring programming model, SpringSource Tool Suite and Spring Roo. The highlights of the announcement include:

  • Tight integration with SpringSource Tool Suite and Spring Roo to provide a polished, productive developer experience
  • Innovative, close integration between Spring and Google Web Toolkit offering the ability to build rich applications with amazing speed
  • The ability to easily target Spring applications to Google App Engine
  • A compelling integration between Spring Insight and Google Speed Tracer to provide insight into the performance of Spring applications from browser to database

Google TV
This was the main announcement of the second half of the Day 2 keynote. A lot of people were surprised as there were talks of a Google tablet in the air. The keynote demo was very interesting as they ran into a number of glitches involving Bluetooth connectivity between the keyboard and set top box (no one thought of bringing a standard keyboard with a cable?). The idea is not new but they are bringing together some industry powerhouses (Sony, Intel, Adobe, Best Buy, Logitech and Dish Network) to bring the concept to market by this Christmas. TechCrunch has a really good review of Google TV.

Some other interesting announcements were:


VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Google, Google App Engine, Wave

No Comments

Java Command Line App Using the Salesforce WSC

May 17th, 2010

The Force.com Web Service Connector (WSC) is a high performance web services stack that is much easier to implement than the “tried and true” Force.com Web Services API. Here’s a quick command line app you can use as a starter application. This class simply creates a new Account and then queries for the 5 newest Accounts by created date.

To get started, download wsc-18.jar from the WSC project’s download page to your desktop (any location will do). Now log into your Developer org and download the Partner WSDL (Setup -> App Setup -> Develop -> API) to your desktop as “partner.wsdl”. Now we’ll need to generate the stub code from the Partner WSDL. Make sure you have Java 1.6 installed and open a command prompt. Now run wsdlc on the Partner WSDL you just downloaded (detailed instruction are here):

java -classpath wsc-18.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

This will create a “partner.jar” file on your desktop. If you are using a Sandbox instead of a Developer or Production org, here are instructions for running wsdlc as there are a few issues. Your console should look similar to:

Note: You can also simply download the partner-18.jar and bypass the steps above to generate the partner.jar.

Now create a new Java project in Eclipse, add the wsc-18.jar and partner.jar files to your build path and copy the code below. You’ll need to add your username and password/security token before you run the code. Running the code should produce output similar to:

Here’s the starter code for the application.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.jeffdouglas;
 
import com.sforce.soap.partner.*;
import com.sforce.soap.partner.sobject.*;
import com.sforce.ws.*;
 
public class Main {
 
  public static void main(String[] args) {
 
    ConnectorConfig config = new ConnectorConfig();
    config.setUsername("YOUR-USERNAME");
    config.setPassword("YOUR-PASSWORD-AND-SECURITYTOKEN");
 
    PartnerConnection connection = null;
 
    try {
 
      // create a connection object with the credentials
      connection = Connector.newConnection(config);
 
      // create a new account
      System.out.println("Creating a new Account...");
      SObject account = new SObject();
      account.setType("Account");
      account.setField("Name", "ACME Account 1");
      SaveResult[] results = connection.create(new SObject[] { account });
      System.out.println("Created Account: " + results[0].getId());
 
      // query for the 5 newest accounts
      System.out.println("Querying for the 5 newest Accounts...");
      QueryResult queryResults = connection.query("SELECT Id, Name from Account " +
          "ORDER BY CreatedDate DESC LIMIT 5");
      if (queryResults.getSize() > 0) {
        for (SObject s: queryResults.getRecords()) {
          System.out.println("Id: " + s.getField("Id") + " - Name: "+s.getField("Name"));
        }
      }
 
    } catch (ConnectionException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
 
  }
 
}
VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Code Sample, Java, Salesforce

3 Comments

THIS is why I love the cloud…

May 14th, 2010

I blew out the harddrive on my MacBook Pro yesterday during a meeting. Kaput. Dead. Nada. After working with Apple Support for a couple of hours I took it to the Apple store and they sent away for a new harddrive. I’ll be up and running this afternoon thanks to Apple and Time Machine.

However the best thing about this experience is that it reaffirms my love of the cloud. Besides the time I spent directly working with Apple, I didn’t miss a beat. I fired up another laptop running Ubuntu and I was back to work in no time.

Here’s what makes working in the cloud so enjoyable…

Email – Since we use Google Apps for the Appirio domain all of my mail is stored in the cloud. I didn’t have to reinstall Office, recover my PST file or restore a backup. All of my mail was instantly accessible.

Documents – We run all of our projects on Google Apps so I didn’t lose any info on the three projects on which I am currently working. All of the docs and spreadsheets that I needed were instantly accessible with the latest versions. Again, no software to install or backup files to locate.

Development Environment – Development with Salesforce.com in the cloud is a snap. I installed Eclipse and then the Force.com IDE plugin in a matter of minutes. I simply created a new Force.com project which pulls down all of the source code from the server. I’m back to work! I could have just as easily used the browser to develop but I prefer Eclipse.

Notes – I’m working on a new Salesforce.com book with Wes Nolte and initially thought that I had lost some of my notes pertaining to it. Then I remembered that I have been using Evernote for notes and DropBox for chapters and working materials. Both services have a web interface, iPhone apps and desktop apps for Ubuntu (not sure about Evernote?) so accessing these files was a piece of cake.

Passwords – One of the things I was concerned about was the passwords to all of my websites. Luckily I started using LastPass recently so I just needed to install the LastPass Firefox plugin and log into my account.

Bookmarks – I store all of my bookmarks at delicious so I had instant access from any computer.

Music – Courtesy of Pandora and Grooveshark.

VN:F [1.9.3_1094]
Rating: 10.0/10 (3 votes cast)
VN:F [1.9.3_1094]
Rating: +1 (from 1 vote)

Categories: Cloud Computing

3 Comments

Installing & Running the Force Metadata JDBC Driver for SchemaSpy

May 12th, 2010

The Force Metadata JDBC Driver for SchemaSpy is a really cool tool available at Force.com Code Share that generates ER diagrams for your Salesforce org. Some people have emailed me asking for help installing and running the tool so here are some instructions that supplement what is listed on the project’s wiki page.

Make sure you download the following files from the Downloads tab:

  • force-metadata-jdbc-driver-1.4.jar
  • generated-sforce-partner-18.jar
  • force.properties
  • depends.zip

You’ll also need to download the schemaSpy_4.1.1.jar file from the SchemaSpy files page and install Graphviz so it can generate the graphs. There is both a Mac and PC version.

The Partner web service is pointing to www.salesforce.com. If you want to generate your ER diagrams against a Sandbox org, you’ll have to make some modifications as outlined on the wiki page.

I created a folder on my desktop call “run-schemaspy” and dropped all of my files in there. Your folder should look similar to:



I also created a build file which I dropped in that same directory. Make sure you add your Salesforce username and password/token.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<project default="document">
 
  <property name="sf.username" value="SALESFORCE_USERNAME"/>
  <property name="sf.password" value="SALESFORCE_PASSWORD_AND_SECURITY_TOKEN"/>
 
  <target name="document">
      <echo message="Generating SchemaSpy documentation (requires Graphviz to be installed to produce diagrams)"/>
      <delete dir="doc" failonerror="false"/>
      <java classname="net.sourceforge.schemaspy.Main" fork="true" failonerror="true">
          <arg line="-t schemaspy/force"/>
          <arg line="-db Claims"/>
          <arg line="-un ${sf.username}"/>
          <arg line="-pw ${sf.password}"/>
          <arg line="-o doc"/>
          <arg line="-font Arial"/>
          <arg line="-fontsize 8"/>
          <arg line="-hq"/>
          <arg line="-norows"/>
          <arg line='-desc "Extracted from ClaimVantage Claims r${env.SVN_REVISION} on Force.com"'/>
          <arg line="-u fake"/>
          <arg line="-p fake"/>
          <arg line="-host fake"/>
          <classpath>
               <fileset dir="schemaspy" includes="*.jar"/>
          </classpath>
      </java>
  </target>
 
</project>

You should then be able to open up a terminal, navigate to the directory on your desktop and run ant using the build file (assuming ant is installed correctly). Your terminal should look like the screenshot below. The script will create a doc directory and generate the ER diagrams in this directory. Simply open index.html file in the doc directory and you are golden!


VN:F [1.9.3_1094]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Salesforce

9 Comments

Announcing the Salesforce Handbook

May 10th, 2010

Wes Nolte and I have just announced that we will be writing a new book aimed at business owners, analysts and developers, that comprehensively documents Salesforce and Force.com.

The Salesforce Handbook
A newcomer’s guide to building applications on Salesforce.com and the Force.com Platform

Hand-in-hand with the book we’ll be publishing content from the book on a WordPress site. Here you can expect to find excerpts from the book, but also content that supplements the book e.g. areas that’ll serve as best-practice hubs with links to official documentation, blog posts that rock the party, and even superb discussion forum threads.

Checkout the book’s site at: http://salesforcehandbook.wordpress.com


VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Salesforce

No Comments

Using Exernal ID Fields in Salesforce

May 7th, 2010

Salesforce has baked in some “magical” features into its platform. Two of my favorites are the upsert command and the use of External IDs. If you are new to the platform, you’ve probably seen the option of making a field an “External ID” during the new field creation process.


The External ID field allows you to store unique record IDs from an external system, typically for integration purposes. So if you have a bespoke marketing system running on SQL Server, it is may be easier to load, update and reference these external records in Salesforce using unique IDs from SQL Server.

Salesforce allows you mark up to 3 fields as External IDs and these fields must be text, number or email field types. Values in these External ID field must also be unique and you can also determine whether or not value are case sensitive.

There are three ways that you typically use External ID field.

Loading Data from External Systems

When you load data from external systems you may want to track the record from the external system for reference or if you want to make updates back into the external system. Simply mark a field as an External ID and the Force.com platform will ensure that each value is unique and that you don’t load duplicate records from the external system.

Making Fields Searchable

When searching for custom object records from the sidebar the following fields are searchable:

  • Name
  • All custom auto number fields

You can make fields searchable by marking them as an External ID. Some people “cheat” and mark fields that do not necessarily contain external record IDs so that they are searchable.

For the advanced search, the following fields are searchable:

  • All custom fields of type text
  • Text area
  • Long text area
  • Email
  • Phone

So if you have a numeric field that is an External ID it will not be searchable via the advanced search. You could create a text External ID field and then write a workflow that updates this field from the numeric External ID field. This way your external ID is searchable.

Data Integration

This is were the External ID field really earns its keep. When using the upsert command during data loading, you can reference the External ID field instead of the Salesforce ID. This is a huge advantage because you typically don’t want to maintain the Salesforce ID in your external system. When uploading data with the Import Wizard, Data Loader or (most) ETL tools like Boomi or Informatica, there is a setting to specify that a field is an External ID.

Salesforce Import Wizard



Data Loader



Boomi



If you are loading data from an external system, External IDs will definitely become your best friends.


VN:F [1.9.3_1094]
Rating: 9.0/10 (1 vote cast)
VN:F [1.9.3_1094]
Rating: +1 (from 1 vote)

Categories: Salesforce

1 Comment

My Son Joined the Navy!

May 6th, 2010

I just got a call from my elder son, Scott, that he just raised his hand and joined the US Navy. It has taken him about 6 months to get all of his paperwork in order but he finally enlisted today as an Aviation Electronic, Electrical, and Computer Systems Technician.

He’s been going to school and managing a pizza place in Gainesville for awhile and finally decided that he wants more out of life. He’s been thinking about the military for quite awhile and perhaps it was some recent changes in his personal life and/or the fact that his little brother is doing so well in the Army that gave him that little nudge.

We are an Army family (me, wife, both dads, two uncles, etc) so it will take some time to get used to the Navy terminology. He’s in good company though as his great-grandfather (in the photo above) was in the Navy in WWII (earned 8 Bronze Stars in the Pacific — still alive!) and his great-great-grandfather went down with the USS Arizona in Pearl Harbor.

He leaves for “A” school (basic training) in December at Great Lakes (near Chicago) and then his “C” school (advanced) in Pensacola. I think his entire training is roughly 8 months or so. He can also volunteer to be an aircrew technician which is physically demanding and somewhat hazardous (flight pay, rescue swimmer training, etc). I asked him if he was interested in that and his reply was, “Hell yea!!”.

I’m really proud of the kid guy and am so glad that he’s finally taken this step in his life. I think it’s going to give him a great future. I just need to find out where I can get a “Proud Navy Dad” bumper sticker to go along with my “Proud Army Dad” one.


VN:F [1.9.3_1094]
Rating: 9.5/10 (4 votes cast)
VN:F [1.9.3_1094]
Rating: 0 (from 0 votes)

Categories: Personal

6 Comments

Feed

http://blog.jeffdouglas.com /

WordPress Appliance - Powered by TurnKey Linux