function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Minh Tran 26Minh Tran 26 

Populate lookup field in custom object

One of the field in my custom object (Program__c) is a contact lookup field (Client__c).  How do I insert a new custom object with an existing contact without getting the this exception:

com.sforce.ws.SoapFaultException: A duplicate value was specified for field 'Id' in object 'Contact'

Thanks,
 
SObject[] records = new SObject[1];

	try {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT Id, FirstName, LastName, AccountId, Account.Name ");
		sb.append("FROM Contact ");
		sb.append("WHERE AccountId != NULL ");
		sb.append("  AND Id = '003d000002w3njaAAA' ");
		QueryResult queryResults = connection.query(sb.toString());
		SObject contact = null;
		if (queryResults.getSize() > 0) {
			contact = (SObject)queryResults.getRecords()[0];
		}

		SObject so = new SObject();
		so.setType("Program__c");
		so.setField("RecordTypeId", "012d0000000hQlHAAU");
		so.setField("Client__r", contact);
		so.setField("Marital_Status__c", "Separated");
		so.setField("Level_of_Care__c", "Inpatient");
		so.setField("Caller_Caregiver_Name__c", "Caregiver Name");
		so.setField("Patient_Type__c", "Impatient Discharge");
		so.setField("Admission_Date__c", new Date());
		so.setField("Projected_Discharge_Date__c", new Date());
		so.setField("Facility__c", "Grossmont");
		so.setField("Notes__c", "Test record added by Minh...");
		records[0] = so;

		// create the records in Salesforce.com
		SaveResult[] saveResults = connection.create(records);

		// check the returned results for any errors
		for (int i = 0; i < saveResults.length; i++) {
			if (saveResults[i].isSuccess()) {
				System.out.println(i+". Successfully created record - Id: " + saveResults[i].getId());
			}
			else {
				Error[] errors = saveResults[i].getErrors();
				for (int j = 0; j < errors.length; j++) {
					System.out.println("Error creating record: " + errors[j].getMessage());
				}
			}
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}

 
Best Answer chosen by Minh Tran 26
Shashikant SharmaShashikant Sharma
Hi Minh,

__r suffix is used to refer to relationships for the fields it is __c . As Client__c is a lookup field on Program__c object replace the

so.setField("Client__r", contact);
With 
so.setField("Client__c", contact.Id);

So your code will be 
 
SObject[] records = new SObject[1];

	try {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT Id, FirstName, LastName, AccountId, Account.Name ");
		sb.append("FROM Contact ");
		sb.append("WHERE AccountId != NULL ");
		sb.append("  AND Id = '003d000002w3njaAAA' ");
		QueryResult queryResults = connection.query(sb.toString());
		SObject contact = null;
		if (queryResults.getSize() > 0) {
			contact = (SObject)queryResults.getRecords()[0];
		}

		SObject so = new SObject();
		so.setType("Program__c");
		so.setField("RecordTypeId", "012d0000000hQlHAAU");
		so.setField("Client__c", contact.Id);
		so.setField("Marital_Status__c", "Separated");
		so.setField("Level_of_Care__c", "Inpatient");
		so.setField("Caller_Caregiver_Name__c", "Caregiver Name");
		so.setField("Patient_Type__c", "Impatient Discharge");
		so.setField("Admission_Date__c", new Date());
		so.setField("Projected_Discharge_Date__c", new Date());
		so.setField("Facility__c", "Grossmont");
		so.setField("Notes__c", "Test record added by Minh...");
		records[0] = so;

		// create the records in Salesforce.com
		SaveResult[] saveResults = connection.create(records);

		// check the returned results for any errors
		for (int i = 0; i < saveResults.length; i++) {
			if (saveResults[i].isSuccess()) {
				System.out.println(i+". Successfully created record - Id: " + saveResults[i].getId());
			}
			else {
				Error[] errors = saveResults[i].getErrors();
				for (int j = 0; j < errors.length; j++) {
					System.out.println("Error creating record: " + errors[j].getMessage());
				}
			}
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}

Let me know if helps you or still see face issue.

Thanks
Shashikant

All Answers

Shashikant SharmaShashikant Sharma
Hi Minh,

__r suffix is used to refer to relationships for the fields it is __c . As Client__c is a lookup field on Program__c object replace the

so.setField("Client__r", contact);
With 
so.setField("Client__c", contact.Id);

So your code will be 
 
SObject[] records = new SObject[1];

	try {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT Id, FirstName, LastName, AccountId, Account.Name ");
		sb.append("FROM Contact ");
		sb.append("WHERE AccountId != NULL ");
		sb.append("  AND Id = '003d000002w3njaAAA' ");
		QueryResult queryResults = connection.query(sb.toString());
		SObject contact = null;
		if (queryResults.getSize() > 0) {
			contact = (SObject)queryResults.getRecords()[0];
		}

		SObject so = new SObject();
		so.setType("Program__c");
		so.setField("RecordTypeId", "012d0000000hQlHAAU");
		so.setField("Client__c", contact.Id);
		so.setField("Marital_Status__c", "Separated");
		so.setField("Level_of_Care__c", "Inpatient");
		so.setField("Caller_Caregiver_Name__c", "Caregiver Name");
		so.setField("Patient_Type__c", "Impatient Discharge");
		so.setField("Admission_Date__c", new Date());
		so.setField("Projected_Discharge_Date__c", new Date());
		so.setField("Facility__c", "Grossmont");
		so.setField("Notes__c", "Test record added by Minh...");
		records[0] = so;

		// create the records in Salesforce.com
		SaveResult[] saveResults = connection.create(records);

		// check the returned results for any errors
		for (int i = 0; i < saveResults.length; i++) {
			if (saveResults[i].isSuccess()) {
				System.out.println(i+". Successfully created record - Id: " + saveResults[i].getId());
			}
			else {
				Error[] errors = saveResults[i].getErrors();
				for (int j = 0; j < errors.length; j++) {
					System.out.println("Error creating record: " + errors[j].getMessage());
				}
			}
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}

Let me know if helps you or still see face issue.

Thanks
Shashikant
This was selected as the best answer
Minh Tran 26Minh Tran 26
Thank you Shashikant!

BTW, since I'm using the Partner WS, it should be:
so.setField("Client__c", contact.getId());

 
Shashikant SharmaShashikant Sharma
Glad that it helped you :).

Please mark this post as solved so that others could be benifitted from it.

Thanks
Shashikant
Minh Tran 26Minh Tran 26
Sorry for a stupid question.  How do I mark this post as solved?  Thx.