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
Jonathan Vance 5Jonathan Vance 5 

Is it possible to programmatically add or remove custom object fields?

I want to write some code to add and remove fields on custom objects via Apex, SOQL, the API, or somehow programmatically rather than altering objects using the Salesforce UI. Is there any Force equivlent to a SQL ALTER TABLE statement? Is it possible to alter (add/remove fields on) custom objects using only code?
NaveenReddyNaveenReddy
Hi ,

The following is a java code to create a custom field on Object.
To add custom field to a custom object use below code. You must use Partner and metadata API's to create the custm field.
 
//To following code creates a metadata connection
import com.sforce.soap.metadata.*;
import com.sforce.soap.partner.LoginResult;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
/**
* Login utility.
*/
public class MetadataLoginUtil {
public static MetadataConnection login() throws ConnectionException {
final String USERNAME = "username@gmail.com";
// This is only a sample. Hard coding passwords in source files is a bad practice.
final String PASSWORD = "Password+SecurityToken";
final String URL = "https://login.salesforce.com/services/Soap/u/31.0";

//Quick Start Step 3: Walk through the Java Sample Code
final LoginResult loginResult = loginToSalesforce(USERNAME, PASSWORD, URL);
//System.out.println(loginResult);
return createMetadataConnection(loginResult);
}
private static MetadataConnection createMetadataConnection(
final LoginResult loginResult) throws ConnectionException {
final ConnectorConfig config = new ConnectorConfig();
config.setServiceEndpoint(loginResult.getMetadataServerUrl());
config.setSessionId(loginResult.getSessionId());
return new MetadataConnection(config);
}
private static LoginResult loginToSalesforce(
final String username,
final String password,
final String loginUrl) throws ConnectionException {
final ConnectorConfig config = new ConnectorConfig();
config.setAuthEndpoint(loginUrl);
config.setServiceEndpoint(loginUrl);
config.setManualLogin(true);
return (new PartnerConnection(config)).login(username, password);
}

}

//The following code creates a custom field using metadata conncetion and createMetadata() method.

import java.util.ArrayList;
import java.util.concurrent.ForkJoinPool.ManagedBlocker;
import com.sforce.async.Error;
import com.sforce.soap.metadata.*;
import com.sforce.soap.metadata.FieldType;
import com.sforce.soap.metadata.Package;
import com.sforce.soap.metadata.SaveResult;
import com.sforce.soap.partner.*;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
import com.sforce.ws.wsdl.SfdcApiType;
/**
* Login utility.
*/
public class PartnerLoginUtil {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
try {
PartnerLoginUtil p= new PartnerLoginUtil( );
p.createCustomExtField("CustomObjectName");

} catch (ConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void createCustomExtField(String name) {
// TODO Auto-generated method stub
CustomField cs = new CustomField();
cs.setFullName(name+".CustExtField__c");
cs.setLabel("CustExtField");
cs.setType(FieldType.Number);
cs.setExternalId(true);
cs.setPrecision(10);
cs.setScale(8);
try {
MetadataConnection metadataConnection = MetadataLoginUtil.login();
SaveResult[] results = metadataConnection
.updateMetadata(new Metadata[] {cs});

for (SaveResult r : results) {
if (r.isSuccess()) {
System.out.println("Created component: " + r.getFullName());
} else {
System.out
.println("Errors were encountered while creating "
+ r.getFullName());
for (com.sforce.soap.metadata.Error e : r.getErrors()) {
System.out.println("Error message: " + e.getMessage());
System.out.println("Status code: " + e.getStatusCode());
}
}
}
} catch (ConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}



Regards,
Naveen
http://www.autorabit.com