Ad Code

Responsive Advertisement

Field mapping using Custom Settings & getDescribeCall


This particular topic is entirely related to how to make/define dynamic mapping using custom settings & getDescribe call.

Problem

Some time customer requires to pass one object information to another object information in salesforce like after creating OpportunityLine Item Data this should also be mapped in QuoteLine Item. And all information (Custom field info.) on OpportunityLineItem should be available on QuoteLineItem objects record. So in this regards developer needs to write a trigger and needs to define each column mapping in the code itself but in future suppose some more field get introduced by customer & again customer want's to map those field so user need to change the code. So here to avoid changing code for mapping purpose only we will use custom settings for the same.“One more example, a customer have object call MarketLead object which is not a actual lead. And user wants to have a Promote MarketLead button which will promote a marketlead record to lead record and in this action all the marketlead information will be captured to Lead object records ”

Solution

we will create a one custom settings object which will contain one custom field. 1. Custom Setting API Name : PreaLeadToLeadPromotionMapping__c
2. Setting Type: List 3. Label : PreaLeadToLeadPromotionMapping Add one field in above custom setting object. API NAME: Lead_Field_API_Name__c Data Type: Text(255) Label Name: Lead Field API Name Now click on Manage Button to define mapping here. click on New button to fill mapping information. Under "Name" field write "MarketLead field API Name" like & under "Lead Field API Name" write Lead field which we want's to maps. And Data will be like this ---------------------------- Name | Lead Field API Name ---------------------------- statuc__c | status__c Rating__c | Rating__c Name__c | LastName Now we will use below code logic in our Apex Code.


view source
<Source Code>
01map<Schema.SObjectField,Schema.SObjectField> mapFieldWiseSchema=new map<Schema.SObjectField,Schema.SObjectField>();
02
03 public Map<string,string> getAllMappingTable(){
04     
05        Map<string, string> MapMappingTable=new map<string,string>();
06        map<string, Schema.SObjectField> mapObjectWiseFieldWiseSchemaField=new map<string, Schema.SObjectField>();
07         
08        list<string> objects=new list<string>();
09        objects.add('Lead');
10        objects.add('Market_Lead__c');
11         
12        for(string s:objects){
13            Map <String, Schema.SObjectType > m = Schema.getGlobalDescribe();
14            Schema.SObjectType sT = m.get(s);
15            Schema.DescribeSObjectResult r = sT.getDescribe();
16            Map<String, Schema.SObjectField> mapData = r.fields.getMap();
17            system.debug('Map Value-->' + mapData.values());
18            Schema.DescribeFieldResult F;
19             
20            for(Schema.SObjectField sField:mapData.values()){
21                F= sField.getDescribe();
22                string sKey=s + F.getName();
23                mapObjectWiseFieldWiseSchemaField.put(sKey,sField);
24            }
25         
26        }
27         
28        qry ='';
29        try{
30             for (PreaLeadToLeadPromotionMapping__c mappingTableRec : PreaLeadToLeadPromotionMapping__c.getall().Values()){
31                if (mappingTableRec.Name != null && mappingTableRec.Lead_Field_API_Name__c != Null ){
32                    MapMappingTable.put(mappingTableRec.Name,mappingTableRec.Lead_Field_API_Name__c);
33                    qry += mappingTableRec.Name + ',';
34                }
35            }
36            for(string sfieldname:MapMappingTable.keySet()){
37                string skey1='Market_Lead__c' + sfieldname;
38                string sKey2='Lead' + MapMappingTable.get(sfieldname);
39                if(mapObjectWiseFieldWiseSchemaField.get(skey1)!=null && mapObjectWiseFieldWiseSchemaField.get(skey2)!=null)
40                    mapFieldWiseSchema.put(mapObjectWiseFieldWiseSchemaField.get(skey1),mapObjectWiseFieldWiseSchemaField.get(skey2));
41            }
42           
43         
44        }catch(exception ex){
45            String msg = ex.getMessage();
46            currentMsg = new ApexPages.Message(ApexPages.severity.ERROR, msg);
47        }
48         
49        return MapMappingTable;
50    }
And we will call above method in our calling class like below.
view source
<Source Code>
01string qry = '';
02public Set<id> ids {get;set;}
03    
04public PageReference PromoteMarketLead()
05     {
06                  
07            getAllMappingTable();
08            list<lead> listlead=new list<lead>();
09            list<sObject> lstsObjects=new list<sObject>();
10                         
11            qry = 'select ' + qry + 'id,Status__c FROM Market_Lead__c limit 100 ';
12            lstsObjects = Database.query(qry);
13            for(sObject MarketLead : lstsObjects)
14            {
15                 
16                    Lead led=new lead();
17                    // This line will calculate mapping here
18                    for(Schema.SObjectField sMarketLead:mapFieldWiseSchema.keySet()){
19                        Schema.SObjectField sLeadField=mapFieldWiseSchema.get(sMarketLead);
20                        led.put(sLeadField, MarketLead.get(sMarketLead));
21                         
22                    }
23                    listlead.add(led);
24                 
25            }
26            if(listlead.size()>0)
27            {
28                 Savepoint sp;
29                 try
30                  {
31                       sp = Database.setSavepoint();
32                       insert listlead;
33                       update lstsObjects;
34                      
35                  }
36                  catch(Exception e)
37                  {
38                      String msg = e.getMessage();
39                      Database.rollback(sp);
40                      ApexPages.Message currentMsg = new ApexPages.Message(ApexPages.severity.ERROR, msg);
41                      ApexPages.addMessage(currentMsg);
42                  
43             
44            }
45         return null;
46    }

Discussion

Please create custom object like Market_Lead__c .
  • Define Custom Settings as mentioned above.
  • Define custom settings Data for mapping

Reactions

Post a Comment

0 Comments