You need to sign in to do that
Don't have an account?

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;
}
}
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
I will only comment on the error, try changing this part of your code
to
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.
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;}