Development questions
When a Case status is updated to Closed, check if there are any open child WorkOrder or Task records; if yes, throw a validation error using addError().
Use before update on Case. When Status becomes Closed, check open WorkOrders and Tasks via aggregate/subqueries.
apex
trigger CaseTrigger on Case (before update) {
Set<Id> closing = new Set<Id>();
for (Case c : Trigger.new) if (c.Status == 'Closed' && Trigger.oldMap.get(c.Id).Status != 'Closed') closing.add(c.Id);
if (closing.isEmpty()) return;
Set<Id> blocked = new Set<Id>();
for (WorkOrder w : [SELECT CaseId FROM WorkOrder WHERE CaseId IN :closing AND IsClosed = false]) blocked.add(w.CaseId);
for (Task t : [SELECT WhatId FROM Task WHERE WhatId IN :closing AND IsClosed = false]) blocked.add(t.WhatId);
for (Case c : Trigger.new) {
if (blocked.contains(c.Id)) c.addError('Close all open Work Orders and Tasks before closing the Case.');
}
}
apex-triggertriggercodingscenariovalidation
More Development questions
- What is an Apex Trigger in Salesforce and when should you use it over Flows?
- What is the difference between before triggers and after triggers?
- Explain all Trigger context variables (isInsert, isUpdate, isDelete, isUndelete, isBefore, isAfter, isExecuting, size, operationType).
- What is the difference between Trigger.new and Trigger.old?
- In which trigger events are Trigger.new and Trigger.newMap available?
- In which trigger events are Trigger.old and Trigger.oldMap available?