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
MarniMarni 

Help with Trigger Roll Up Summary

I have a situation where a child object (Claim__c) technically has multiple Master-Detail relationships.  Since SF does not support this, I needed to create an Apex Trigger to create a roll up summary for one of the 'parent' custom objects (Coverage__c) that is a lookup field (Claim_Coverage__c on object Claim__c).  Here is what I am trying to do:

 

On the Coverage__c custom object populate a field called Coverage_Total_Indemnity_PD__c with a calculation of the Indemnity_PD__c field on Claim__c.

 

This is new to me with Apex but I have made an attempt at the trigger (below) but keep getting the following error:

Error: Compile Error: Variable does not exist: ListCoverages at line 27 column 20

(I note in the code below the line with the error)


From what I understand, this variable does exist earlier in the trigger so I am not sure how to resolve.  Any help is resolving this error is greatly appreciated!  

 

 

trigger CoverageIndemnityPDTrigger On Claim__c(after insert, after update){
set<Id> setCoverageid=new set<Id>();
Map<string,Decimal> CoveragewithTotalIndemnityPD=new Map<string,Decimal>();
for(Claim__c acs:Trigger.New){
if(acs.Claim_Coverage__c!=null && acs.Indemnity_PD__c!=null){
setCoverageid.add(setCoverageid);
}
}

if(setCoverageid.size()>0){
List<Coverage__c> ListCoverages = [Select Id, Coverage_Total_Indemnity_PD__c from Coverage__c where Coverage__c =:setCoverageid];
List<Claim__c> ListCoverageClaims = [Select Id, Indemnity_PD__c from Claim__c where Coverage__c =:setCoverageid and Indemnity_PD__c!=null];
for(Id CoverageId:setCoverageid){
Decimal totCovIndPD=0;
for(Claim__c acs: ListCoverageClaims){
if(CoverageId=acs.Coverage_c){
totCovIndPD=totCovIndPD + acs.Indemnity_PD__c ;
}
}
CoveragewithTotalIndemnityPD.put(CoverageId,totCovIndPD);

}
}

List<Coverage__c> UpdateCoverage=new List<Coverage__c>();

 

****BELOW IS THE LINE THAT CONTAINS THE ERROR -- THE ERROR IS 'LISTCOVERAGES')*****

for(Coverage__c MC:ListCoverages){

 

MC.Coverage_Total_Indemnity_PD__c=CoveragewithTotalIndemnityPD.get(MC.id);
UpdateCoverage.add(MC);
}

if(UpdateCoverage.size()>0){
update UpdateCoverage;
}

}

Best Answer chosen by Admin (Salesforce Developers) 
MarniMarni

I was able to figure out how to get this working, at the same time being able to condense down multiple triggers into a single trigger.  I thought I'd share my code in case anyway else faced the same issue.  The code below rollsup multiple fields on a claim record to the related fields on another object's record.

 

 

 

//This trigger includes all financial rollups to the Coverage

trigger UpdateRollupsToCoverage on Claim__c (after update)

//Define variables
{double sumCoverageTotalExpenseOS = 0.0;
double sumCoverageTotalExpensePD = 0.0;
double sumCoverageTotalLegalOS = 0.0;
double sumCoverageTotalLegalPD = 0.0;
double sumCoverageTotalIndemnityOS = 0.0;
double sumCoverageTotalIndemnityPD = 0.0;
Coverage__c [] coveragesToUpdate = new Coverage__c[]{};

if(Trigger.isUpdate)
if(Claim__c.Claim_Coverage__c!=null)
{Claim__c [] teNew = trigger.new;

for(Claim__c te : teNew)
{for (Coverage__c claimCoverage : [select Id, Name, Coverage_Total_Expense_O_S__c from Coverage__c where Id = :te.Claim_Coverage__c])
{

//Sum all the claimCoverage entries
//Total Expense OS
for (Claim__c expenseOSs: [select Id, Expense_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalExpenseOS += expenseOSs.Expense_OS__c;}
claimCoverage.Coverage_Total_Expense_O_S__c = sumCoverageTotalExpenseOS;
//Total Expense PD
for (Claim__c expensePDs: [select Id, Expense_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalExpensePD += expensePDs.Expense_PD__c;}
claimCoverage.Coverage_Total_Expense_PD__c = sumCoverageTotalExpensePD;
//Total Legal OS
for (Claim__c legalOSs: [select Id, Legal_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalLegalOS += legalOSs.Legal_OS__c;}
claimCoverage.Coverage_Total_Legal_O_S__c = sumCoverageTotalLegalOS;
//Total Legal PD
for (Claim__c legalPDs: [select Id, Legal_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalLegalPD += legalPDs.Legal_PD__c;}
claimCoverage.Coverage_Total_Legal_PD__c = sumCoverageTotalLegalPD;
//Total Indemnity OS
for (Claim__c indemnityOSs: [select Id, Indemnity_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalIndemnityOS += indemnityOSs.Indemnity_OS__c;}
claimCoverage.Coverage_Total_Indemnity_O_S__c = sumCoverageTotalIndemnityOS;
//Total Indemnity PD
for (Claim__c indemnityPDs: [select Id, Indemnity_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalIndemnityPD += indemnityPDs.Indemnity_PD__c;}
claimCoverage.Coverage_Total_Indemnity_PD__c = sumCoverageTotalIndemnityPD;

//add claimCoverage to list to be updated outside of the loop
coveragesToUpdate.add(claimCoverage);}}}

//commit the changes to Salesforce
update coveragesToUpdate;}

All Answers

TheIntegratorTheIntegrator

I will only comment on the error, try changing this part of your code

 

trigger CoverageIndemnityPDTrigger On Claim__c(after insert, after update){
set<Id> setCoverageid=new set<Id>();
Map<string,Decimal> CoveragewithTotalIndemnityPD=new Map<string,Decimal>();
for(Claim__c acs:Trigger.New){
if(acs.Claim_Coverage__c!=null && acs.Indemnity_PD__c!=null){
setCoverageid.add(setCoverageid);
}
}
if(setCoverageid.size()>0){
List<Coverage__c> ListCoverages = [Select Id, Coverage_Total_Indemnity_PD__c from Coverage__c where Coverage__c =:setCoverageid];
List<Claim__c> ListCoverageClaims = [Select Id, Indemnity_PD__c from Claim__c where Coverage__c =:setCoverageid and Indemnity_PD__c!=null];

 to

trigger CoverageIndemnityPDTrigger On Claim__c(after insert, after update){
set<Id> setCoverageid=new set<Id>();
List<Claim__c> ListCoverageClaims = new List<Claim__c>();
List<Coverage__c> ListCoverages = new List<Coverage__c>();

Map<string,Decimal> CoveragewithTotalIndemnityPD=new Map<string,Decimal>();
for(Claim__c acs:Trigger.New){
if(acs.Claim_Coverage__c!=null && acs.Indemnity_PD__c!=null){
setCoverageid.add(setCoverageid);
}
}
if(setCoverageid.size()>0){
ListCoverages = [Select Id, Coverage_Total_Indemnity_PD__c from Coverage__c where Coverage__c =:setCoverageid];
ListCoverageClaims = [Select Id, Indemnity_PD__c from Claim__c where Coverage__c =:setCoverageid and Indemnity_PD__c!=null];

 

the issue is that lists are declared inside an If statement and may not be visible further down the code based on the outcome of the condition.

MarniMarni

I was able to figure out how to get this working, at the same time being able to condense down multiple triggers into a single trigger.  I thought I'd share my code in case anyway else faced the same issue.  The code below rollsup multiple fields on a claim record to the related fields on another object's record.

 

 

 

//This trigger includes all financial rollups to the Coverage

trigger UpdateRollupsToCoverage on Claim__c (after update)

//Define variables
{double sumCoverageTotalExpenseOS = 0.0;
double sumCoverageTotalExpensePD = 0.0;
double sumCoverageTotalLegalOS = 0.0;
double sumCoverageTotalLegalPD = 0.0;
double sumCoverageTotalIndemnityOS = 0.0;
double sumCoverageTotalIndemnityPD = 0.0;
Coverage__c [] coveragesToUpdate = new Coverage__c[]{};

if(Trigger.isUpdate)
if(Claim__c.Claim_Coverage__c!=null)
{Claim__c [] teNew = trigger.new;

for(Claim__c te : teNew)
{for (Coverage__c claimCoverage : [select Id, Name, Coverage_Total_Expense_O_S__c from Coverage__c where Id = :te.Claim_Coverage__c])
{

//Sum all the claimCoverage entries
//Total Expense OS
for (Claim__c expenseOSs: [select Id, Expense_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalExpenseOS += expenseOSs.Expense_OS__c;}
claimCoverage.Coverage_Total_Expense_O_S__c = sumCoverageTotalExpenseOS;
//Total Expense PD
for (Claim__c expensePDs: [select Id, Expense_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalExpensePD += expensePDs.Expense_PD__c;}
claimCoverage.Coverage_Total_Expense_PD__c = sumCoverageTotalExpensePD;
//Total Legal OS
for (Claim__c legalOSs: [select Id, Legal_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalLegalOS += legalOSs.Legal_OS__c;}
claimCoverage.Coverage_Total_Legal_O_S__c = sumCoverageTotalLegalOS;
//Total Legal PD
for (Claim__c legalPDs: [select Id, Legal_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalLegalPD += legalPDs.Legal_PD__c;}
claimCoverage.Coverage_Total_Legal_PD__c = sumCoverageTotalLegalPD;
//Total Indemnity OS
for (Claim__c indemnityOSs: [select Id, Indemnity_OS__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalIndemnityOS += indemnityOSs.Indemnity_OS__c;}
claimCoverage.Coverage_Total_Indemnity_O_S__c = sumCoverageTotalIndemnityOS;
//Total Indemnity PD
for (Claim__c indemnityPDs: [select Id, Indemnity_PD__c from Claim__c where Claim_Coverage__c = :claimCoverage.id])
{sumCoverageTotalIndemnityPD += indemnityPDs.Indemnity_PD__c;}
claimCoverage.Coverage_Total_Indemnity_PD__c = sumCoverageTotalIndemnityPD;

//add claimCoverage to list to be updated outside of the loop
coveragesToUpdate.add(claimCoverage);}}}

//commit the changes to Salesforce
update coveragesToUpdate;}

This was selected as the best answer