Apex Academy
Módulo 1·05·24 min

sObjects

El tipo que convierte un registro de Salesforce en una variable. Aquí es donde Apex deja de parecer un lenguaje genérico.

En Admin esObject Manager es el molde; cada registro, una fila

✓ En esta sub-lección

  1. 01Crear un registro en memoria y rellenar sus campos.
  2. 02Usar nombres de API en lugar de etiquetas, y saber por qué importa.
  3. 03Distinguir un registro que existe en memoria de uno que existe en la base de datos.

La nutria: ¿Te acuerdas? · Repaso de la lección 4

¿Qué devuelve Date.today().daysBetween(renewalDate)?

Hasta ahora las variables guardaban un dato suelto: un texto, un número, una fecha. Un sObject guarda una fila entera (un registro con todos sus campos) y en Apex se maneja exactamente igual que cualquier otra variable.

La nutria: Object Manager es la definición; el sObject es la fila

Así lo entendí yo: en Setup defines el objeto Account una vez (qué campos tiene, de qué tipo, con qué nombre de API). Eso es el molde. Cada cuenta que existe en la org es una fila hecha con ese molde. Cuando en Apex escribes Account, estás usando el molde; cuando escribes new Account(), estás fabricando una fila nueva.
Account a = new Account();

EL REGISTRO, EN MEMORIA

  • Name—
  • Industry—
  • Idnull

Paso 1 de 5

new Account() fabrica una fila con el molde que define Object Manager. Existe solo en la memoria de esta transacción: en la base de datos todavía no hay nada.

Mismo molde a ambos lados. La diferencia está en si la fila ya se guardó o todavía solo existe en memoria.

Crear un registro

La palabra new fabrica un registro vacío del objeto que le digas. A partir de ahí, cada campo se rellena con un punto: el punto significa «el campo de».

Apex
Account newAccount = new Account();
newAccount.Name = 'Northwind Trading';
newAccount.Industry = 'Technology';
newAccount.NumberOfEmployees = 340;

Hay una forma más corta que hace lo mismo en una sola sentencia: pasar los campos dentro de los paréntesis, cada uno con su nombre. Es la que verás en el código de cualquier org.

Apex
Account newAccount = new Account(
    Name = 'Northwind Trading',
    Industry = 'Technology',
    NumberOfEmployees = 340
);
Dentro de los paréntesis se usa un solo igual, aunque estés «configurando» y no comparando.

El nombre de API manda

En el layout ves «Número de empleados». En Apex escribes NumberOfEmployees. La etiqueta es para las personas y puede cambiar (incluso traducirse) sin romper nada; el nombre de API es el que usa el código y no cambia jamás una vez creado.

Tipo de campoCómo se escribeEjemplo
EstándarTal cual, sin sufijo.opportunity.StageName
PersonalizadoTermina en __c (dos guiones bajos).lead.Region__c
Objeto personalizadoEl propio objeto también lleva __c.new Assignment_Rule__c()
IdentificadorSiempre se llama Id.account.Id

En memoria no es lo mismo que guardado

Crear un sObject con new es como pulsar «Nuevo» en la interfaz y empezar a rellenar el formulario: el registro existe delante de ti, pero todavía no está en la base de datos. Su campo Id está vacío, nadie más lo ve y, si la termina, desaparece. Guardarlo es otra operación () y tiene su propio módulo.

Apex
Opportunity opp = new Opportunity(Name = 'Renovación Northwind');

System.debug(opp.Id);      // null: todavía no existe en la base de datos
System.debug(opp.Name);    // 'Renovación Northwind'

Leer campos de un registro

Leer se hace con el mismo punto, y el valor que sale tiene el tipo del campo: un campo de texto devuelve un String, uno de moneda devuelve un Decimal, una casilla devuelve un Boolean. Por eso todo lo de las sub-lecciones anteriores sigue aplicando aquí.

Apex
Account account = new Account(Name = '  acme corp  ', AnnualRevenue = 500000);

String tidyName = account.Name.trim();          // método de String sobre un campo
Decimal revenue = account.AnnualRevenue;        // un campo Currency es Decimal
Integer nameLength = account.Name.length();
Un campo no es un tipo aparte: es un String, un Decimal o una Date, con todos sus métodos.

La nutria: En account.Name.trim() el punto hace dos trabajos

Esto me confundió al principio, porque el punto hace dos trabajos. El primero significa «el campo de»: account.Name es como el campo de combinación {!Account.Name} de una plantilla de email. El segundo es el de los métodos: a ese String le pides trim(). Se lee de izquierda a derecha, igual que cualquier cadena: registro → campo → método. En fórmula sería TRIM(Account.Name). Mi forma de distinguirlos: si lleva paréntesis es un método; si no los lleva, es un campo.
Apex
Account account = new Account(Name = '  acme corp  ', Industry = 'technology');

String shortCode = account.Name.trim().substring(0, 4).toUpperCase(); // 'ACME'
Boolean isTech = account.Industry.equalsIgnoreCase('Technology');     // true
String label = account.Name.trim() + ' · ' + account.Industry;        // 'acme corp · technology'
Si el campo estuviera vacío (null), el primer método de la cadena lanzaría NullPointerException. La sub-lección siguiente es justo sobre eso.