InformaciĆ³n general sobre desencadenadores de Apex
Objetivos de aprendizaje
DespuƩs de completar esta unidad, podrƔ hacer lo siguiente:
- Escribir un desencadenador para un objeto de Salesforce.
- Utilizar variables de contexto de desencadenadores.
- Llamar a un mƩtodo de clase desde un desencadenador.
- Usar el mƩtodo
addError()
de sObject en un desencadenador para restringir las operaciones de guardado.
Antes de comenzar
Los desencadenadores de Apex son Ćŗtiles, divertidos y geniales. Si bien este mĆ³dulo lo ayuda a empezar a utilizarlos, tambiĆ©n hace referencia a otras funciones de Salesforce para mostrarle el poder de los desencadenadores de Apex. Para aprovechar al mĆ”ximo este mĆ³dulo, le recomendamos que consulte primero estos mĆ³dulos:
- Inicio rƔpido: Apex
- Fundamentos y base de datos de Apex
- SOQL para administradores
- Fundamentos de Developer Console
Escritura de desencadenadores de Apex
Los desencadenadores de Apex permiten realizar acciones personalizadas antes o despuĆ©s de eventos para registros en Salesforce, como inserciones, actualizaciones o eliminaciones. Del mismo modo que los sistemas de bases de datos admiten desencadenadores, Apex permite el uso de desencadenadores para la gestiĆ³n de registros.
Normalmente, los desencadenadores se usan para realizar operaciones basadas en condiciones especĆficas, modificar registros relacionados o impedir determinadas operaciones. Puede usar desencadenadores para realizar cualquier operaciĆ³n admitida en Apex, lo que incluye la ejecuciĆ³n de SOQL y DML o la llamada a mĆ©todos Apex personalizados.
Use desencadenadores para realizar tareas que no se pueden realizar con herramientas interactivas (apuntar y hacer clic) en la interfaz de usuario de Salesforce. Por ejemplo, si se valida el valor de un campo o se actualiza un campo en un registro, utilice flujos y reglas de validaciĆ³n. Use desencadenadores de Apex si el desempeƱo y la escala son importantes, si su lĆ³gica es demasiado compleja para las herramientas interactivas o si estĆ” ejecutando operaciones con gran consumo de CPU.
Se pueden definir desencadenadores para objetos estĆ”ndar de nivel superior, como una cuenta o un contacto, objetos personalizados y determinados objetos secundarios estĆ”ndar. Los desencadenadores se activan de forma predeterminada al crearlos. Salesforce activa automĆ”ticamente desencadenadores cuando se producen eventos de base de datos especĆficos.
Sintaxis de desencadenadores
La sintaxis de una definiciĆ³n de desencadenador es distinta de la sintaxis de una definiciĆ³n de clase. La definiciĆ³n de un desencadenador empieza por la palabra clave trigger
. A continuaciĆ³n, le siguen el nombre del desencadenador, el objeto de Salesforce con el que estĆ” asociado el desencadenador y las condiciones en las que este se activa. Un desencadenador tiene la siguiente sintaxis:
Para ejecutar un desencadenador antes o despuĆ©s de operaciones de inserciĆ³n, actualizaciĆ³n, eliminaciĆ³n y recuperaciĆ³n, especifique varios eventos de desencadenador en una lista separada por comas. Los eventos que se pueden especificar son:
before insert
(antes de insertar)before update
(antes de actualizar)before delete
(antes de eliminar)after insert
(despuƩs de insertar)after update
(despuƩs de actualizar)after delete
(despuƩs de eliminar)after undelete
(despuƩs de recuperar)
Ejemplo de desencadenador
Este desencadenador sencillo se activa antes de insertar una cuenta y escribe un mensaje en el registro de depuraciĆ³n.
- En Developer Console, haga clic en File (Archivo) | New (Nuevo) | Apex Trigger (Desencadenador de Apex).
- Ingrese
HelloWorldTrigger
como nombre del desencadenador y, a continuaciĆ³n, seleccione la cuenta para sObject. Haga clic en Enviar. - Sustituya el cĆ³digo predeterminado por lo siguiente:
- Para guardar, pulse Ctrl+S.
- Para probar el desencadenador, cree una cuenta.
- Haga clic en Debug (Depurar) | Open Execute Anonymous Window (Abrir ventana de ejecuciĆ³n anĆ³nima).
- En la ventana nueva, agregue lo siguiente y, a continuaciĆ³n, haga clic en Execute (Ejecutar).
- En el registro de depuraciĆ³n, busque la declaraciĆ³n
Hello World!
. En el registro se muestra ademƔs que el desencadenador se ha ejecutado.
Tipos de desencadenadores
Hay dos tipos de desencadenadores.
- Los desencadenadores previos se usan para actualizar o validar valores de registro antes de guardarlos en la base de datos.
- Los desencadenadores posteriores se usan para acceder a los valores de campo establecidos por el sistema (por ejemplo, campo
Id
oLastModifiedDate
de un registro) y aplicar cambios a otros registros. Los registros que activan el desencadenador posterior son de solo lectura.
Uso de variables de contexto
Para acceder a los registros que activan el desencadenador, use variables de contexto. Por ejemplo, Trigger.New
contiene todos los registros insertados en desencadenadores de inserciĆ³n o actualizaciĆ³n. Trigger.Old
proporciona la versiĆ³n anterior de sObjects antes de actualizarlos en desencadenadores de actualizaciĆ³n o una lista de sObjects eliminados en desencadenadores de eliminaciĆ³n. Los desencadenadores se pueden activar cuando se inserta un registro o cuando se insertan numerosos registros de forma masiva mediante la API o Apex. Por consiguiente, las variables de contexto, como Trigger.New
, pueden contener solo un registro o varios registros. Puede iterar en Trigger.New
para obtener cada sObject individual.
Este ejemplo es una versiĆ³n modificada del desencadenador de ejemplo HelloWorldTrigger
. Itera en cada cuenta mediante un bucle for y actualiza el campo DescripciĆ³n
en cada caso.
Algunas otras variables de contexto devuelven un valor booleano para indicar si el desencadenador se ha activado debido a una actualizaciĆ³n o a algĆŗn otro evento. Estas variables son de utilidad cuando un desencadenador combina varios eventos. Por ejemplo:
La tabla siguiente es una lista de todas las variables de contexto para desencadenadores.
Variable | Uso |
---|---|
isExecuting | Devuelve true si el contexto actual para el cĆ³digo Apex es un desencadenador, pero no una pĆ”gina de Visualforce, un servicio web o una llamada a API |
isInsert | Devuelve |
isUpdate | Devuelve |
isDelete | Devuelve |
isBefore | Devuelve |
isAfter | Devuelve |
isUndelete | Devuelve |
new | Devuelve una lista de versiones nuevas de registros de sObject. Esta lista de sObject solamente estĆ” disponible en desencadenadores |
newMap | AsignaciĆ³n de Id. a las versiones nuevas de los registros de sObject. Esta asignaciĆ³n solo estĆ” disponible en los desencadenadores |
old | Devuelve una lista de versiones anteriores de registros de sObject. Esta lista de sObjects solo estĆ” disponible en los desencadenadores |
oldMap | AsignaciĆ³n de Id. a las versiones anteriores de los registros de sObject. Esta asignaciĆ³n solo estĆ” disponible en los desencadenadores |
operationType | Devuelve una enumeraciĆ³n de tipo System.TriggerOperation correspondiente a la operaciĆ³n actual. Los posibles valores de la enumeraciĆ³n |
size | NĆŗmero total de registros en una invocaciĆ³n de desencadenadores (tanto anteriores como nuevos). |
Llamada a un mƩtodo de clase desde un desencadenador
Puede llamar a mĆ©todos de utilidad pĆŗblicos desde un desencadenador. La llamada a mĆ©todos de otras clases permite la reutilizaciĆ³n de cĆ³digo, reduce el tamaƱo de los desencadenadores y mejora el mantenimiento del cĆ³digo Apex. AdemĆ”s, permite el uso de programaciĆ³n orientada a los objetos.
En el siguiente ejemplo de desencadenador se muestra cĆ³mo llamar a un mĆ©todo estĆ”tico desde un desencadenador. Si el desencadenador se ha activado debido a un evento de inserciĆ³n, en el ejemplo se llama al mĆ©todo estĆ”tico sendMail()
de la clase EmailManager
. Este mĆ©todo de utilidad envĆa un email al destinatario especificado y contiene el nĆŗmero de registros de contacto insertados.
- En Developer Console, haga clic en Archivo | Nuevo | Clase de Apex.
- Ingrese
EmailManager
y haga clic en OK (Aceptar). - Sustituya el cuerpo de clase predeterminado por el ejemplo de clase
EmailManager
que se muestra a continuaciĆ³n. - En Developer Console, haga clic en File (Archivo) | New (Nuevo) | Apex Trigger (Desencadenador de Apex).
- Ingrese
ExampleTrigger
como nombre del desencadenador y, a continuaciĆ³n, seleccione Contact (Contacto) para sObject. Haga clic en Enviar. - Sustituya el cĆ³digo predeterminado por lo siguiente y, a continuaciĆ³n, modifique el texto del marcador de posiciĆ³n de email
sendMail()
con su direcciĆ³n de email. - Para guardar, pulse Ctrl+S.
- Para probar el desencadenador, cree un contacto.
- Haga clic en Debug (Depurar) | Open Execute Anonymous Window (Abrir ventana de ejecuciĆ³n anĆ³nima).
- En la ventana nueva, agregue lo siguiente y, a continuaciĆ³n, haga clic en Execute (Ejecutar).
- En el registro de depuraciĆ³n, compruebe si el desencadenador se ha activado. Al final del registro, busque el mensaje de depuraciĆ³n escrito mediante el mĆ©todo de utilidad:
DEBUG|Email sent successfully
- A continuaciĆ³n, compruebe si recibiĆ³ un email con el texto de cuerpo
1 contact(s) were inserted
(Se insertĆ³ 1 contacto).
Con el nuevo desencadenador, recibirĆ” un email cada vez que agregue uno o varios contactos.
AdiciĆ³n de registros relacionados
Los desencadenadores se suelen usar para gestionar y acceder a registros relacionados con otros registros en el contexto del desencadenador (registros que activan el desencadenador).
Este desencadenador agrega una oportunidad relacionada para cada cuenta nueva o actualizada si no hay ninguna oportunidad asociada a la cuenta. El desencadenador realiza primero una consulta SOQL para obtener todas las oportunidades secundarias de las cuentas en las que se ha activado el desencadenador. A continuaciĆ³n, el desencadenador itera en la lista de sObjects en Trigger.New
para obtener el sObject de cada cuenta. Si la cuenta no tiene ningĆŗn sObject de oportunidad relacionado, el bucle (for) crea uno. Si el desencadenador ha creado oportunidades, la declaraciĆ³n final las inserta.
- Agregue el siguiente desencadenador mediante Developer Console (realice los pasos del ejemplo de
HelloWorldTrigger
, pero useAddRelatedRecord
como nombre del desencadenador). - Para probar el desencadenador, cree una cuenta en la interfaz de usuario de Salesforce y asĆgnele el nombre
Apples & Oranges
(Manzanas y naranjas). - En la lista relacionada de oportunidades de la pƔgina de la cuenta, busque la oportunidad nueva. El desencadenador ha agregado esta oportunidad automƔticamente.
Uso de excepciones de desencadenadores
En ocasiones, es posible que necesite agregar restricciones para determinadas operaciones de base de datos, como impedir que los registros se guarden cuando se cumplen determinadas condiciones. Para evitar que los registros se guarden en un desencadenador, llame al mƩtodo addError()
del sObject en cuestiĆ³n. El mĆ©todo addError()
genera un error grave en el desencadenador. El mensaje de error se muestra en la interfaz de usuario y se registra.
El siguiente desencadenador impide la eliminaciĆ³n de una cuenta si esta tiene oportunidades relacionadas. De forma predeterminada, la eliminaciĆ³n de una cuenta provoca la eliminaciĆ³n en cascada de todos sus registros relacionados. Este desencadenador impide la eliminaciĆ³n en cascada de las oportunidades. Pruebe este desencadenador. Si ha ejecutado el ejemplo anterior, su organizaciĆ³n tiene una cuenta llamada Apples & Oranges
con una oportunidad relacionada. En este ejemplo se usa dicha cuenta.
- Use Developer Console para agregar el siguiente desencadenador.
- En la interfaz de usuario de Salesforce, navegue hasta la pƔgina de la cuenta
Apples & Oranges
(Manzanas y naranjas) y haga clic en Delete (Eliminar). - En la ventana emergente de confirmaciĆ³n, haga clic en OK (Aceptar).
Busque el error de validaciĆ³n con el mensaje de error personalizadoCannot delete account with related opportunities
(No se puede eliminar la cuenta con oportunidades relacionadas).
- Desactive el desencadenador
AccountDeletion
. Si deja este desencadenador activado, no podrĆ” revisar los aspectos complejos.
- En Setup (ConfiguraciĆ³n), busque
Apex Triggers
(Desencadenadores de Apex). - En la pƔgina Desencadenadores de Apex, haga clic en Edit (Modificar) junto al desencadenador
AccountDeletion
. - Anule la selecciĆ³n de EstĆ” activo (Is Active).
- Haga clic en Save (Guardar).
Desencadenadores y llamadas
Apex permite hacer llamadas e integrar el cĆ³digo Apex con servicios web externos. Estos contactos de Apex con servicios web externos se denominan llamadas. Por ejemplo, puede hacer una llamada a un servicio de cotizaciĆ³n para conocer las Ćŗltimas cotizaciones. Al hacer una llamada desde un desencadenador, dicha llamada se debe hacer de forma asĆncrona para que el proceso del desencadenador no le impida trabajar mientras espera la respuesta del servicio externo. La llamada asĆncrona se realiza mediante un proceso en segundo plano y la respuesta se recibe cuando el servicio externo la devuelve.
Para hacer una llamada desde un desencadenador, llame a un mĆ©todo de clase que se ejecute de forma asĆncrona. Este mĆ©todo se llama mĆ©todo futuro y se anota con @future(callout=true)
. Esta clase de ejemplo contiene el mƩtodo futuro que hace la llamada.
En este ejemplo se muestra el desencadenador que llama al mĆ©todo en la clase para hacer una llamada asĆncrona.
Esta secciĆ³n es solo una descripciĆ³n general de las llamadas y el objetivo no es proporcionar informaciĆ³n detallada. Para obtener mĆ”s informaciĆ³n, consulte InvocaciĆ³n de llamadas utilizando Apex en la GuĆa del desarrollador de Apex.
Recursos
- GuĆa del desarrollador de Apex: Desencadenadores
- GuĆa del desarrollador de Apex: Invocar llamadas usando Apex
- Trailhead: Servicios de integraciĆ³n de Apex