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...