
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:
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];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;
}
}
}
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.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;
}
}
}
}