miércoles, 1 de octubre de 2025

Auditoría de Errores en Salesforce: Implementando RaisesPlatformEvents en Apex

Hace unos meses me encontraba haciendo una superbadge sobre integraciones en Salesforce cuando me encontré con esta interfaz que nunca había usado.

La interfaz RaisesPlatformEvents permite crear automáticamente un objeto del tipo BatchApexErrorEvent cada vez que se registra un error en un batch job, este objeto representa un evento de plataforma asociado a la clase Batch.

Respecto a los eventos de plataforma aquí va la definición que da la ayuda de Salesforce: "Utilizando eventos de plataforma, los publicadores pueden enviar datos de eventos personalizados a través de Apex, un proceso, un flujo, una API Pub/Sub u otras API. Los suscriptores pueden recibir mensajes de eventos personalizados desde Salesforce o un sistema externo utilizando clientes de Apex, Pub/Sub API, procesos o flujos."

Aquí va un ejemplo de como se podría usar la interfaz en un batch para generar eventos de plataforma cuando ocurre algún error y como podemos capturar el evento creado usando un Flow. 


global class RaisesPlatformEventsBatch implements Database.Batchable<sObject>,
Database.RaisesPlatformEvents {

    global Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator('SELECT Id FROM Account LIMIT 50000');
    }

    global void execute(Database.BatchableContext bc, List<Account> scope) {
        System.assert(false);
    }

    global void finish(Database.BatchableContext bc) {
    }

}


En este caso usamos un Flow pero perfectamente podemos hacer un trigger sobre el objeto BatchApexErrorEvent. Para el ejemplo elegí enviar un correo con los campos que me parecían mas pertinentes pero perfectamente se podría efectuar alguna lógica sobre el registro, incluso se me ocurre que algún agente de IA pueda usar un Flow como este pero eso todavía tengo que investigarlo.





Recursos

Firing Platform Events from Batch Apex | Apex Developer Guide | Salesforce Developers

lunes, 15 de septiembre de 2025

Consultas Polimórficas en Salesforce: Dominando TYPEOF en SOQL

Hace unos años estaba haciendo algún desarrollo que parecía bastante sencillo e incluía una query similar a esta: 

SELECT Id, Owner.DeveloperName FROM Case

Lo cual para mi sorpresa dio el siguiente error: 

No such column 'DeveloperName' on entity 'Name'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names.

Eso fue un momento WTF, revisé los permisos del campo y todo se veía correcto, por ahí me doy cuenta de que el Owner no necesariamente debe ser un usuario como yo había presupuesto si no que puede también ser un grupo por lo cual cuando se pide un campo que no está en ambos objetos Salesforce tira un error. En este punto debo comentar que Salesforce ha ido relajando los errores en las operaciones polimorficas y que ahora son bastante menos comunes, de hecho me costó bastante reproducir este error ahora, en muchos casos nuestra query simplemente devolvera el campo vacío o no devolverá registros si es que lo estamos usando para filtrar los datos.

Siguiente tema ¿ahora como arreglo esto? lo pensé por varios lados y no le encontraba la vuelta, así que me puse a googlear y me encontré con esta maravilla: 

la palabra reservada TYPEOF permite hacer un IF dentro de una SOQL query

En el caso del ejemplo se usuario de la siguiente manera

SELECT Id, TYPEOF Owner WHEN Group THEN DeveloperName END FROM Case

Esto devuleve el campo Id para todos los casos y el campo developerName solo cuando el Owner del registro es un Grupo.

Lamentablemente esto no se muestra en el editor de consultas de la consola por lo cual solo es util cuando estamos usando Apex, algo así ejecutado en la consola muestra la información buscada:


for (Case myCase : [
    SELECT
        Id,
        TYPEOF Owner
            WHEN Group THEN DeveloperName
        END
    FROM Case
]) {
    if (myCase.Owner instanceof Group) {
        Group grupo = myCase.Owner;

        System.debug('Id: ' + myCase.Id + ' - ' + ' Developer Name: ' + grupo.DeveloperName);
    }
}




Recursos

TYPEOF | SOQL and SOSL Reference | Salesforce Developers

Auditoría de Errores en Salesforce: Implementando RaisesPlatformEvents en Apex

Hace unos meses me encontraba haciendo una superbadge sobre integraciones en Salesforce cuando me encontré con esta interfaz que nunca había...