Lógica y Eventos
Triggers de Tabla
Dificultad: 6/10Los Triggers (Disparadores) son fragmentos de código AL que se ejecutan automáticamente por la plataforma cuando ciertos *eventos físicos* suceden con los registros de la base de datos.
Eventos de la Tabla
Si escribimos código dentro de ciertas funciones pre-generadas en la raíz del objeto table,
nos aseguramos que ese código SIEMPRE se ejecute (a menos que el programador meta un bypass inseguro)
sin importar desde qué pantalla ni cómo llegó la orden.
- OnInsert(): Se dispara mágicamente la primera vez que un registro en blanco (nuevo) es salvado en SQL. Se usa muchísimo para autocompletar números de serie, asignar fechas de hoy "Create Date" y arrastrar campos principales.
- OnModify(): Se dispara cada vez que una columna existente de un registro guardado recibe un valor diferente. Se usa para auditar, guardar históricos de "Modificado Por" o bloquear ciertas ediciones ("Si la factura ya está contabilizada, Error()").
- OnDelete(): Justo antes de destruir el registro. Se usa comúnmente para validar dependencias ("Error() si un Cliente con facturas abiertas intenta ser borrado").
- OnRename(): Es el más raro. Se utiliza solo si intentamos cambiar físicamente el valor bloqueado de la Clave Primaria (Primary Key). Se usa mucho en BC si cambias una "Categoría de Producto", este trigger navega por las tablas relacionadas actualizando los viejos nombres por el nuevo automáticamente para que nada se rompa.
Triggers de Campo (OnValidate)
Puesto que un `OnModify` es general de toda la fila, el trigger más usado en el día a día es el que posee *cada campo* por separado: OnValidate().
Tú teclean en un campo de la pantalla, presionas el *Tabulador* del teclado, e inmediatamente "OnValidate()" salta.
Se usa para calcular campos relacionados en vivo. Ejemplo maestro: El usuario cambia la `Cantidad`, el código `OnValidate()` de la cantidad atrapa un evento que coge el `Precio Unitario` de otro lado, los multiplica e inyecta la respuesta en el `Importe Módificado` de forma automática.
field(5; "Cantidad"; Decimal)
{
trigger OnValidate()
begin
// Si cambias la cantidad, yo me encargo del resto.
Rec."Importe Total" := Rec."Cantidad" * Rec."Precio Unitario";
end;
}