Upserting data into Salesforce using JAVA (Web Service API)

To upsert data in Salesforce using external application, upsert () method is used.

upsert()
Creates new records and updates existing records; uses a custom field to determine the presence of existing records. In most cases, we recommend that you use upsert () instead of create() to avoid creating unwanted duplicate records (idempotent). You can process records for one more than object type in an create() or update()
call, but all records must have the same object type in an upsert () call.

Upsert is a merging of the words insert and update. This call is available for objects if the object has an external ID field or a field with the idLookup field property. On custom objects, this call uses an indexed custom field called an external ID to determine whether to create a new record or update an existing record. On standard objects, this call can use the name of any field with the idLookup field property instead of the external ID.

Note:
Starting with API version 15.0, if you specify a value for a field that contains a string, and the value is too big for the field, the call fails and an error is returned. In previous versions of the API the value was truncated and the call succeeded. If you wish to keep the old behavior with versions 15.0 and later, use the AllowFieldTruncationHeader SOAP header.

Syntax
UpsertResult[] = connection.upsert(String externalIdFieldName, sObject[] sObjects);

Sample JAVA Program to upsert data in Salesforce

package wsc;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.GetUserInfoResult;
import com.sforce.soap.enterprise.UpsertResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

public class UpsertAccount
{
            public String authEndPoint = "";
            EnterpriseConnection con;
            private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            public static void main(String[] args)
            {          
                        UpsertAccount sample = new UpsertAccount("https://login.salesforce.com/services/Soap/c/24.0/0DF90000000PX8r");
                        if ( sample.login() )
                        {
                                    sample.updateAcct();
                        }
            }
            public UpsertAccount(String authEndPoint)
            {
                        this.authEndPoint = authEndPoint;
            }
            public String getUserInput(String prompt)
            {
                        String result = "";
                        try
                        {
                                    System.out.print(prompt);
                                    result = reader.readLine();
                        }
                        catch (IOException ioe)
                        {
                                    ioe.printStackTrace();
                        }
                        return result;
            }
            public boolean login()
            {
                        boolean success = false;
                        String userId = getUserInput("UserID: ");
                        String passwd = getUserInput("Password + Security Token: ");
                        try
                        {
                                    /* Setting up Username and Password */
                                    ConnectorConfig config = new ConnectorConfig();
                                    config.setAuthEndpoint(authEndPoint);
                                    config.setUsername(userId);
                                    config.setPassword(passwd);
                                    config.setCompression(true);
                                    //config.setProxy("Your Proxy", 80);
                                    System.out.println("AuthEndPoint: " + authEndPoint);
                                    config.setTraceFile("upsertLogs.txt");
                                    config.setTraceMessage(true);


                                    config.setPrettyPrintXml(true);

                                    System.out.println("\nLogging in ...\n");
                                    /* Setting up connection to Salesforce */
                                    con = new EnterpriseConnection(config);
                                    GetUserInfoResult userInfo = con.getUserInfo();   
                                    System.out.println("UserID: " + userInfo.getUserId());
                                    System.out.println("\nLogged in Successfully\n");
                                    success = true;
                        }
                        catch (ConnectionException ce)
                        {
                                    ce.printStackTrace();
                        }
                        catch (FileNotFoundException fnfe)
                        {
                                    fnfe.printStackTrace();
                        }
                        return success;
            }
            public void updateAcct()
            {
                        try
                        {                      
                                    /* Getting Account details */
                                    SObject[] upserts = new Account[1];
                                    Account upsertAccount = new Account();
                                    String acctName = getUserInput("Enter Account name:");
                                    String acctNo = getUserInput("Enter Account no:");
                                    String phoneNo = getUserInput("Enter phone no:");
                                    String extId = getUserInput("Enter External Id:");
                                   
                                    upsertAccount.setName(acctName);
                                    upsertAccount.setPhone(phoneNo);
                                    upsertAccount.setAccountNumber(acctNo);
                                    upsertAccount.setExternal_ID__c(extId);
                                   
                                    upserts[0] = upsertAccount;
                                    System.out.println("\nUpserting...");
                                    /* Upserting account records */   
                                    UpsertResult[] upsertResults = con.upsert("External_ID__c",upserts);
                                    for (UpsertResult result : upsertResults)
                                    {
                                                if (result.isSuccess())
                                                {
                                                            System.out.println("\nUpsert succeeded.");
                                                            System.out.println(
                                                                                    (result.isCreated() ? "Insert" : "Update") +
                                                                                    " was performed."
                                                            );
                                                            System.out.println("Account ID: " + result.getId());
                                                }
                                                else
                                                {
                                                            System.out.println("The Upsert failed because: " +
                                                                                    result.getErrors()[0].getMessage());
                                                }
                                    }
                        }
                        catch (ConnectionException ce)
                        {
                                    ce.printStackTrace();
                        }
            }
}


Output:

UserID: chennai@infallible.com
Password + Security Token: user01xmJO32dqadfdwB1kFNW9kEw
AuthEndPoint: https://login.salesforce.com/services/Soap/c/24.0/0DF90adfadf00PX8r
[WSC][UpsertAccount.login:63]Log file already exists, appending to upsertLogs.txt

Logging in ...

UserID: 0059dfadffqXHsAAM

Logged in Successfully

Enter Account name:Test Poc111
Enter Account no:222
Enter phone no:22223456543
Enter External Id:1024

Upserting...

Upsert succeeded.
Insert was performed.
Account ID: 0019000000BOU6ZAAX

4 comments:

  1. All the examples I've seen use External IDs. But it may be useful to have an example which uses internal ID fields. The upsert() API allows you to specify any ID field for the comparison. To do this , you specify "ID" as the first parameter of the Upsert call. This then looks for a match on the SalesForce IDs of the records passed in.

    For an update, do a SObject.setID() using the SalesForce ID of the record to be updated.

    For an insert, don't set the ID in array passed in to Upsert().

    Upsert() returns the sfID for any inserted records.

    (We keep track of Sales force IDs as we create records, to avoid having to do queries on Salesforce, which is how we know the IDs to pass into Upsert() ).

    ReplyDelete