sObjects
El tipo que convierte un registro de Salesforce en una variable. Aquí es donde Apex deja de parecer un lenguaje genérico.
✓ En esta sub-lección
- 01Crear un registro en memoria y rellenar sus campos.
- 02Usar nombres de API en lugar de etiquetas, y saber por qué importa.
- 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
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.
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».
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.
Account newAccount = new Account(
Name = 'Northwind Trading',
Industry = 'Technology',
NumberOfEmployees = 340
);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 campo | Cómo se escribe | Ejemplo |
|---|---|---|
| Estándar | Tal cual, sin sufijo. | opportunity.StageName |
| Personalizado | Termina en __c (dos guiones bajos). | lead.Region__c |
| Objeto personalizado | El propio objeto también lleva __c. | new Assignment_Rule__c() |
| Identificador | Siempre 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.
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í.
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();La nutria: En account.Name.trim() el punto hace dos trabajos
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'