Skip to main content
I was trying to make my hands dirty with the apex coding as I am really really weak in that. Below is the piece of Code I wrote which is getting called by a trigger(following the best practices). However I am getting this really frustrating error:

Initial term of field expression must be a concrete SObject

Here's my sceranio:

I want to retrieve a perticular record from the custom metadata type(Client_Settings__mdt) and fill in the remaining values in my layout automatically before the record gets saved. Below are my code snipets Trigger:

trigger ScoreCostSavings on SCORE_Cost_Savings__c (before insert,before update,before delete,

after insert,after update,after delete) {

//check if this is before trigger or after trigger

SCORE_Cost_Savings__c[] scs = Trigger.new;

ScoreCodeFrameworkUtil scfu = new ScoreCodeFrameworkUtil();

if(Trigger.isbefore){

if(Trigger.isInsert){

//Code that would fire before any record is inserted

scfu.updID(scs);

}

else if(Trigger.isUpdate){

//Code that would fire before any record is updated

scfu.updID(scs);

}

else if(Trigger.isDelete){

//Code that would fire before any record is deleted

}

}

else{

if(Trigger.isInsert){

//Code that would fire after any record is updated

}

else if(Trigger.isUpdate){

//Code that would fire after any record is updated

}

else if(Trigger.isDelete){

//Code that would fire after any record is deleted

}

}

and here goes the Class:

public class ScoreCodeFrameworkUtil{

private Integer count;

public void updID(SCORE_Cost_Savings__c[] scrdta){

//SCORE_Client_Settings__mdt[] scsm = [SELECT MasterLabel,Program_Framework__c,Sub_Program_Framework__c FROM SCORE_Client_Settings__mdt];

List<SCORE_Client_Settings__mdt> scsm = [SELECT MasterLabel,NamespacePrefix,Program_Framework__c,Sub_Program_Framework__c FROM SCORE_Client_Settings__mdt where MasterLabel =: scrdta.Code__c Limit 1];

if(!scsm.isEmpty()){

//scsm[0].First_Name__c = billing.billingfirstname;

scrdta.Program_Framework__c = scsm[0].Program_Framework__c;

}

}

}

Error line:

List scsm = [SELECT MasterLabel,NamespacePrefix,Program_Framework__c,Sub_Program_Framework__c FROM SCORE_Client_Settings__mdt where MasterLabel =: scrdta.Code__c Limit 1];
1 Antwort
  1. 21. Sept. 2016, 13:28

    public class ScoreCodeFrameworkUtil{

    private Integer count;

    public void updID(SCORE_Cost_Savings__c[] scrdta){

    Set<String> setCode = new Set<String>();

    Map<String, SCORE_Client_Settings__mdt> mapCodeToClientSetting = new Map<String, SCORE_Client_Settings__mdt>();

    /** always we have to bulkify trigger code assuming that multiple records will be inserted/updated at once **/

    // collect codes

    for(SCORE_Cost_Savings__c objScore : scrdta)

    {

    if(String.isNotBlank(objScore.Code__c))

    setCode.add(objScore.Code__c);

    }

    // query matching mdt based on collected codes and keep mappings in a map.

    if(!setCode.isEmpty())

    for(SCORE_Client_Settings__mdt objClientSetting : [SELECT MasterLabel,NamespacePrefix,Program_Framework__c,Sub_Program_Framework__c

    FROM SCORE_Client_Settings__mdt

    WHERE MasterLabel IN: setCode])

    {

    mapCodeToClientSetting.put(objClientSetting.MasterLabel, objClientSetting);

    }

    // assign values from matched mdt

    for(SCORE_Cost_Savings__c objScore : scrdta)

    {

    if(mapCodeToClientSetting.containsKey(objScore.Code__c))

    {

    objScore.Program_Framework__c = mapCodeToClientSetting.get(objScore.Code__c).Program_Framework__c;

    // if any other field to set like Sub_Program_Framework__c then add below line

    objScore.Sub_Program_Framework__c = mapCodeToClientSetting.get(objScore.Code__c).Sub_Program_Framework__c;

    }

    }

    }

    }

    NOTE : This code is optimized in insert case. We can even optimize the code for before update case by considering following usecases :

    1. Perform query mdt and assign values logic only if code is changed (not every time a record is edited)

    2. While updating if code is blank, then we have to blank out Program_Framework__c, Sub_Program_Framework__c.

     
0/9000