Folgende Sammlung diverser Methoden und Funktionen stammt aus dem letzten Salesforce-to-Salesforce Projekt. Der Code ist dynamisch aufgebaut und kann ohne Anpassungen benutzt werden.
****************
Gibt ein Feld mit allen Eigenschaften zurück
Erwartet Objekt API Name und Feld API Name
*/
private Schema.DescribeFieldResult getDescribeField(String sObjApiName, String sFieldName){
Schema.SObjectType t = Schema.getGlobalDescribe().get(sObjApiName);
Schema.DescribeSObjectResult r = t.getDescribe();
Schema.DescribeFieldResult f = r.fields.getMap().get(sFieldName).getDescribe();
return f;
}
/****************
Gibt den Feldtypnamen zurück
Erwartet ein Feld
Der Rückgabewert ist z.B.:
'DATE'
'DOUBLE'
'CURRENCY'
'PHONE'
'EMAIL'
'REFERENCE'
*/
private String getFieldType(Schema.DescribeFieldResult f){
return f.getType().name();
}
/****************
Alle Felder eines Objekts
*/
public static Map<String, Schema.SObjectField> getFieldMapFromObject(String objName){
return Schema.getGlobalDescribe().get(objName).getDescribe().fields.getMap();
}
/****************
Gibt eine map mit allen RecordTypes zurück
Erwartet einen Objekt API-Namen
*/
public static map<String,Schema.RecordTypeInfo> getRecordTypesFromObject(String objName){
return Schema.getGlobalDescribe().get(objName).getDescribe().getRecordTypeInfosByName();
}
/****************
Gibt den API Namen eines Objektes zurück
Erwartet eine ID
*/
public static String getObjectnameByObjectID(String sID){
String sName;
if(isValidId(sID)){
String keyCode = sID.subString(0,3);
Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();
for(Schema.SObjectType objectInstance : gd.values()){
if(objectInstance.getDescribe().getKeyPrefix() == keyCode)
sName = objectInstance.getDescribe().getName();
}
}
return sName;
}
//******************************************************
// Salesforce-To-Salesforce (block with methods used by this feature)
//******************************************************
/****************
Gibt die ID der Salesforce-to-Salesforce Verbindung mit der Partner Org
Erwartet den Namen der Salesforce-to-Salesforce Verbindung
*/
public static Id getConnectionId(String connectionName) {
List<PartnerNetworkConnection> partnerNetConList = [Select id from PartnerNetworkConnection where connectionStatus = 'Accepted' and connectionName = :connectionName];
Id idReturn;
if( partnerNetConList.size() > 0 ) {
idReturn = partnerNetConList.get(0).Id;
}
return idReturn;
}
/****************
Sendet die Liste mit Objekte an die Partner Org
Erwartet eine Liste mit Objekten, eine map mit Parent Objekten, eine map mit weiteren Beziehungen, einen Verbindungsnamen
*/
public static void sendToPartnerOrg( List<sObject> objectList, Map<Id,Id> parentRecordIdMap, Map<Id,String> relatedRecordsMap, String connectionName ){
if ( objectList != null && !objectList.isEmpty() ){
Id connectionId = getConnectionId( connectionName );
if(connectionId != null){
List<PartnerNetworkRecordConnection> objectConnections = new List<PartnerNetworkRecordConnection>();
for (sObject obj: objectList)
objectConnections.add( createPnrcObject(connectionId,obj, parentRecordIdMap, relatedRecordsMap) );
if ( !objectConnections.isEmpty() ) {
upsertConnectionObjects(objectConnections,objectList);
}
}
}
}
/****************
Schreibt die für Salesforce-to-Salesforce benötigten Daten in die Datenbank bzw. aktualisiert diese
Erwartet eine Liste mit PartnerNetworkRecordConnections, eine Liste mit den für S-t-S relevanten Objekten
*/
private static void upsertConnectionObjects(List<PartnerNetworkRecordConnection> objectConnections,List<sObject> objectList){
try{
database.insert( objectConnections );
}catch( DMLException dmlEx ){
system.debug(logginglevel.ERROR,dmlEx.getMessage());
for ( Integer i = 0; i < dmlEx.getNumDml(); i++ )
if( dmlEx.getDmlStatusCode( i ) == 'INVALID_PARTNER_NETWORK_STATUS' )
for( PartnerNetworkRecordConnection connectionItem: objectConnections )
if( dmlEx.getDmlId( i ) == connectionItem.Id )
for( sObject obj : objectList )
if( connectionItem.LocalRecordId == obj.Id )
obj.addError( 'Incorrect partner network status.' );
}
}
/****************
Erstellt eine neue S-t-S Verbindung für ein bestimmtes Objekt
Erwartet eine ID der relevanten Verbindung, eine Objekt ID + Eigenschaften der neuen Verbindung
*/
private static PartnerNetworkRecordConnection createPnrcObject(Id connectionId, Sobject obj , Map<Id,Id> parentRecordIdMap, Map<Id,String> relatedRecordsMap){
return new PartnerNetworkRecordConnection(
ConnectionId = connectionId,
LocalRecordId = obj.Id,
SendClosedTasks = false,
// SendClosedTasks and SendOpenTasks false because we do not wont to forward them too
SendOpenTasks = false,
SendEmails = true,
ParentRecordId = parentRecordIdMap != null ? parentRecordIdMap.get( obj.Id ): null,
RelatedRecords = relatedRecordsMap != null ? relatedRecordsMap.get( obj.Id ): null
);
}
Kommentare
Kommentar veröffentlichen