Orden de ejecución en Salesforce
Todo lo que ocurre, y en qué orden, desde que alguien pulsa Guardar hasta que el registro queda confirmado: validaciones, flows, triggers, reglas y roll-ups. Saberlo es lo que te permite explicar comportamientos que parecen magia.
✓ En esta sub-lección
- 01Situar los triggers before y after dentro del orden de ejecución.
- 02Predecir qué ve una regla de validación o un flow según dónde corre respecto a tu trigger.
- 03Usar un trigger before para completar datos que una validación exige.
La nutria: ¿Te acuerdas? · Repaso de la lección 3
En after insert haces a.Rating = 'Warm'; sobre un registro de Trigger.new. ¿Qué pasa?
«La regla de validación salta aunque mi trigger ya rellenó el campo.» «El flow ve el valor viejo.» «El roll-up no se actualiza hasta que refresco.» Casi todos los misterios de automatización en Salesforce se resuelven con la misma herramienta: saber en qué orden ocurren las cosas cuando se guarda un registro. Salesforce lo llama , y es de lo más preguntado en el examen Platform Developer I.
La nutria: El paralelo de Admin
El recorrido de un guardado, paso a paso
Pulsa Reproducir y sigue al registro. Puedes pararlo, ir hacia atrás o pulsar cualquier paso para leer qué ocurre en él. Los dos pasos marcados como «tu código» son tus triggers.
Paso 1 de 12
Validación del sistema
Campos obligatorios del formato de página, tipos, longitudes, listas de selección restringidas. Es el error rojo que sale antes que nada.
Cinco consecuencias que te ahorran horas
- Los flows «Fast Field Updates» corren antes que tus triggers before. Si los dos tocan el mismo campo, gana el trigger, porque escribe el último.
- Las validation rules corren después de los triggers before. Por eso un trigger before puede rellenar un campo que una regla de validación exige, y la regla ya lo verá relleno.
- Los triggers after corren antes que los flows «Actions and Related Records». Si un flow after necesita algo que crea tu trigger after, ya estará.
- Un roll-up en el padre no es parte de tu guardado: el padre pasa por su propio guardado, con su propio orden de ejecución y sus propios triggers.
- Nada es definitivo hasta el commit. Si un flow after-save falla, también se deshace lo que hizo tu trigger before. Es la misma del Módulo 4, con el mismo presupuesto de límites.
Un caso práctico: rellenar lo que la validación exige
Imagina una regla de validación en Contact: «el país es obligatorio». Los contactos que llegan de una integración vienen sin país, pero su cuenta sí lo tiene. Como los triggers before corren antes que las validation rules, un trigger before insert puede copiar el país de la cuenta antes de que la regla mire. La consulta a la cuenta se hace con la receta del Módulo 4: juntar Ids, una consulta, un Map.
trigger ContactCountry on Contact (before insert) {
Set<Id> accountIds = new Set<Id>();
for (Contact c : Trigger.new) {
if (String.isBlank(c.MailingCountry) && c.AccountId != null) {
accountIds.add(c.AccountId);
}
}
Map<Id, Account> accounts = new Map<Id, Account>(
[SELECT Id, BillingCountry FROM Account WHERE Id IN :accountIds]
);
for (Contact c : Trigger.new) {
Account acc = accounts.get(c.AccountId);
if (String.isBlank(c.MailingCountry) && acc != null) {
c.MailingCountry = acc.BillingCountry; // antes de que mire la validación
}
}
}La nutria: Ver el orden de verdad: los Debug Logs
La nutria: ¿Y por qué no un Flow? La salida en Flow existía