Sei sulla pagina 1di 17

Colecciones de Apex: lista

Las listas contienen una colección ordenada de objetos. Las listas en Apex son
equivalentes a conjuntos y ambos elementos se pueden usar de forma
intercambiable.

Las dos declaraciones siguientes son equivalentes. La variable colors se declara


mediante la sintaxis de lista.

List<String> colors = new List<String>();

Copy

De forma alternativa, la variable colors se puede declarar como un conjunto, pero


se asigna a una lista en lugar de a un conjunto.

String[] colors = new List<String>();

Copy

En general, es más fácil crear una lista que un conjunto, ya que las listas no
requieren que determine por anticipado cuántos elementos necesita asignar.

Puede agregar elementos a una lista en el momento de crearla o después


mediante la llamada al método add() . En el primer ejemplo se muestran ambos
métodos de adición de elementos a una lista.

// Create a list and add elements to it in one step

List<String> colors = new List<String> { 'red', 'green', 'blue' };

// Add elements to a list after it has been created

List<String> moreColors = new List<String>();

moreColors.add('orange');

moreColors.add('purple');
Llamar a un método estático

Dado que el método sendMail() de nuestra clase no tiene acceso a las variables de
miembro de clase, no es necesario que sea un método de instancia. Vamos a cambiarlo a un
método estático mediante la adición de la palabra clave static a su declaración. Es más
fácil llamar a los métodos estáticos que a los métodos de instancia, ya que no necesitan ser
llamados en una instancia de la clase, sino que se llama directamente en el nombre de la
clase.

1. En Developer Console, busque la ficha abierta para la clase EmailManager y


modifique la primera línea de la definición del método sendMail() del modo
siguiente (el único cambio es la adición de la palabra clave static ).

public static void sendMail(String address, String subject, String


body) {

Copy

2. Pulse Ctrl+S para guardar la clase.


3. Modifique las declaraciones de la ventana de ejecución anónima para llamar al
método estático en el nombre de clase.

4. EmailManager.sendMail('Your email address', 'Trailhead Tutorial',


'123 body');

Copy

5. Haga clic en Execute (Ejecutar).

Creación de variables de sObject


Para crear un sObject, debe declarar una variable y asignarla a una instancia de
sObject. El tipo de datos de la variable es el tipo de sObject.

En el siguiente ejemplo se crea una variable de sObject del tipo cuenta y se asigna
a una cuenta nueva con el nombre Acme.

Account acct = new Account(Name='Acme');


Manipular registros con DML

Cree y modifique registros en Salesforce mediante el uso del lenguaje de


manipulación de datos (DML, Data Manipulation Language). DML es un método
sencillo para gestionar registros mediante una serie de declaraciones simples para
insertar, actualizar, combinar, eliminar y restaurar registros.

Dado que Apex es un lenguaje centrado en los datos y se guarda en la plataforma


Lightning, tiene acceso directo a sus datos en Salesforce. A diferencia de otros
lenguajes de programación que requieren una configuración adicional para la
conexión con fuentes de datos, en el caso de DML de Apex, se simplifica la
gestión de registros. Mediante la llamada a declaraciones DML, puede realizar
rápidamente operaciones en sus registros de Salesforce.
En este ejemplo se agrega la cuenta Acme a Salesforce. En primer lugar se crea
una cuenta sObject y, a continuación, se pasa como un argumento a la
declaración insert , lo que tiene como resultado la persistencia del registro en
Salesforce.

// Create the account sObject

Account acct = new Account(Name='Acme', Phone='(415)555-1212',


NumberOfEmployees=100);

// Insert the account by using DML

insert acct;

Copy

Declaraciones DML
Están disponibles las siguientes declaraciones DML.

 insert
 update
 upsert
 delete
 undelete
 merge

Cada declaración DML acepta un único sObject o una lista (o conjunto) de


sObjects. La realización de operaciones en una lista de sObjects es un método
más eficiente para procesar los registros.
Todas estas declaraciones, a excepción de un par, son operaciones de base de
datos conocidas. Las declaraciones upsert y merge son específicas de Salesforce
y pueden ser de gran utilidad.

La operación DML upsert crea registros y actualiza los registros de sObject en


una sola declaración mediante un campo especificado para determinar la
presencia de objetos existentes o el campo de Id. si no se especifica ningún
campo.

La declaración merge combina hasta tres registros del mismo tipo de sObject en
uno de los registros mediante la eliminación de los demás y la reorganización
jerárquica de todos los registros relacionados.

Asignación automática de campos de Id. a registros nuevos


Al insertar registros, el sistema asigna un Id. a cada registro. Además de
garantizar la persistencia del valor de Id. en la base de datos, el valor de Id. se
completa automáticamente en la variable de sObject usada como argumento en la
llamada a DML.

En este ejemplo se muestra cómo obtener el Id. en el sObject correspondiente a la


cuenta insertada.

// Create the account sObject

Account acct = new Account(Name='Acme', Phone='(415)555-1212',


NumberOfEmployees=100);

// Insert the account by using DML

insert acct;

// Get the new ID on the inserted sObject argument

ID acctID = acct.Id;

// Display this ID in the debug log

System.debug('ID = ' + acctID);

// Debug log result (the ID will be different in your case)

// DEBUG|ID = 001D000000JmKkeIAF
Alteración de registros
Si tiene una lista con una combinación de registros nuevos y existentes, puede
procesar inserciones y actualizaciones para todos los registros de la lista mediante
la declaración upsert . La alteración permite evitar la creación de registros
duplicados y ahorrar tiempo, ya que no necesita determinar qué registro existe
primero.

La declaración upsert determina la coincidencia de los sObjects y los registros


existentes mediante la comparación de los valores de un solo campo. Si no
especifica ningún campo al llamar a esta declaración, la declaración upsert usa el
Id. de sObject para determinar la coincidencia de sObject y los registros existentes
de Salesforce.

Sintaxis de upsert

upsert sObject | sObject[]

upsert sObject | sObject[] field

El campo opcional es un token de campo. Por ejemplo, para especificar el campo


MyExternalID, la declaración es:

upsert sObjectList Account.Fields.MyExternalId;

Copy

En el caso de upsert, se usan la clave principal del registro de sObject (Id.), un


campo idLookup o un campo de Id. externo para determinar si se debe crear un
registro nuevo o actualizar uno existente:

 Si la clave no coincide, se crea un registro de objeto.


 Si la clave coincide una vez, se actualiza el registro de objeto existente.
 Si la clave coincide varias veces, se genera un error y el registro de objeto
no se inserta ni actualiza.
Eliminación de registros
Puede eliminar registros persistentes mediante la declaración delete . Los
registros eliminados no se eliminan de forma permanente de Plataforma Lightning,
sino que se envían a la papelera de reciclaje durante 15 días y se pueden
restaurar desde ahí.

En este ejemplo se muestra cómo eliminar todos los contactos con el apellido
Smith. Si realiza las acciones del ejemplo en el caso de DML masivo, su
organización ya debería tener dos contactos con el apellido Smith. Ejecute este
miniprograma en la consola de desarrollador mediante Apex anónimo y, a
continuación, verifique que ya no hay contactos con el apellido Smith.

Contact[] contactsDel = [SELECT Id FROM Contact WHERE LastName='Smith'];

delete contactsDel;

Excepciones de declaraciones DML


Si una operación DML genera un error, devuelve una excepción del
tipo DmlException . Puede capturar las excepciones del código para controlar los
errores.

En este ejemplo se produce una excepción del tipo DmlException porque se intenta
insertar una cuenta sin el campo Nombre obligatorio. La excepción se captura en
un bloque de captura.

try {

// This causes an exception because

// the required Name field is not provided.

Account acct = new Account();

// Insert the account

insert acct;

} catch (DmlException e) {

System.debug('A DML exception has occurred: ' +

e.getMessage());
}

Métodos de base de datos

Apex contiene la clase de base de datos integrada, lo que proporciona métodos


para realizar operaciones DML y reflejar homólogos de declaraciones DML.

Estos métodos de base de datos son estáticos y se llama a ellos en el nombre de


clase.

 Database.insert()
 Database.update()
 Database.upsert()
 Database.delete()
 Database.undelete()
 Database.merge()

A diferencia de las declaraciones DML, los métodos de base de datos incluyen un


parámetro allOrNone opcional que permite especificar si la operación debe ser
correcta parcialmente. Cuando este parámetro se establece en false , si se
produce un error en un conjunto parcial de registros, los registros correctos se
confirman y los errores se devuelven para los registros incorrectos. Además, no se
producen excepciones con la opción de validez parcial.

De este modo, llama al método insert con allOrNone establecido en false .

Database.insert(recordList, false);

Copy

Los métodos de base de datos devuelven objetos de resultados que contienen


información de validez o error para cada registro. Por ejemplo, las operaciones de
inserción y actualización devuelven en cada caso un conjunto de
objetos Database.SaveResult .

Database.SaveResult[] results = Database.insert(recordList, false);

De forma predeterminada, el parámetro allOrNone es true , lo que significa que el


método de base de datos se comporta como su homólogo de declaración DML y
producirá una excepción si se detecta un error.
Las dos declaraciones siguientes son equivalentes a la declaración insert
recordList; .

Database.insert(recordList);

Copy

Y:

Database.insert(recordList, true);

Copy

Actualización de registros relacionados


Los campos de los registros relacionados no se pueden actualizar con la misma
llamada a la operación DML y requieren una llamada a DML independiente. Por
ejemplo, si va a insertar un contacto nuevo, puede especificar el registro de cuenta
relacionado del contacto mediante la configuración del valor del campo AccountId .
No obstante, no puede cambiar el nombre de la cuenta sin actualizar la cuenta
mediante una llamada a DML independiente. De forma similar, al actualizar un
contacto, si desea además actualizar la cuenta relacionada del contacto, debe
hacer dos llamadas a DML. En el ejemplo siguiente se actualizan un contacto y su
cuenta relacionada mediante dos declaraciones update .

// Query for the contact, which has been associated with an account.

Contact queriedContact = [SELECT Account.Name

FROM Contact

WHERE FirstName = 'Mario' AND LastName='Ruiz'

LIMIT 1];

// Update the contact's phone number

queriedContact.Phone = '(415)555-1213';

// Update the related account industry

queriedContact.Account.Industry = 'Technology';

// Make two separate calls


// 1. This call is to update the contact's phone.

update queriedContact;

// 2. This call is to update the related account's Industry field.

update queriedContact.Account;

Eliminación de registros relacionados


La operación delete admite eliminaciones en cascada. Si elimina un objeto
principal, elimina también automáticamente los secundarios siempre que cada
registro secundario se pueda eliminar.

Por ejemplo, la eliminación de la cuenta creada anteriormente (SFDC Account)


eliminará también su contacto relacionado.

1. Ejecute este miniprograma en la ventana de código Apex anónimo de la


consola de desarrollador.

2. Account[] queriedAccounts = [SELECT Id FROM Account WHERE


Name='SFDC Account'];

delete queriedAccounts;

Copy

3. Compruebe las cuentas y los contactos de su organización.

Verá que se han eliminado tanto la cuenta como su contacto relacionado.

Recursos

 Apex Developer Guide


 Apex Developer Guide: Working with Data in Apex
 Apex Developer Guide: Agregar y recuperar datos con DML
 Apex Developer Guide: Database Class
Sintaxis de SOQL básica
Esta es la sintaxis de una consulta de SOQL básica:

SELECT fields FROM ObjectName [WHERE Condition]

Copy

La cláusula WHERE es opcional. Vamos a empezar con una consulta muy


sencilla. Por ejemplo, la siguiente consulta recupera cuentas y obtiene dos
campos para cada cuenta (ID y Phone).

SELECT Name,Phone FROM Account

Copy

La consulta consta de dos partes:

1. SELECT Name,Phone :en esta parte se incluyen los campos que desea
recuperar. Los campos se especifican después de la palabra clave SELECT
en una lista delimitada por comas. O bien, puede especificar un solo
campo, en cuyo caso no es necesario el uso de comas (por
ejemplo, SELECT Phone ).
2. FROM Account : en esta parte se especifica el objeto estándar o
personalizado que desea recuperar. En este ejemplo, es Account. En el
caso de un objeto personalizado llamado Invoice_Statement, es
Invoice_Statement__c.

Más allá de lo básico

A diferencia de otros lenguajes SQL, no puede especificar * para todos los


campos. Debe especificar cada campo que desee obtener de forma explícita. Si
intenta acceder a un campo que no ha especificado en la cláusula SELECT,
obtendrá un error debido a que el campo no se ha recuperado.

No necesita especificar el campo Id en la consulta, ya que siempre se devuelve en


las consultas de Apex con independencia de que se haya especificado o no en la
consulta. Por ejemplo: SELECT Id,Phone FROM Account y SELECT Phone FROM
Account son declaraciones equivalentes. La única ocasión en la que puede que
desee especificar el campo Id es cuando se trata del único campo que va a
recuperar debido a que tiene una lista de un campo como mínimo: SELECT Id FROM
Account .
Filtrado de resultados de consulta con condiciones
Si tiene varias cuentas en la organización, se devolverán todas. Si desea limitar
las cuentas devueltas a las cuentas que cumplen una condición determinada,
puede agregar esta condición en la cláusula WHERE. En el siguiente ejemplo se
recuperan solo las cuentas cuyos nombres son SFDC Computing. Observe que no
se aplica la distinción entre mayúsculas y minúsculas a las comparaciones de las
cadenas.

SELECT Name,Phone FROM Account WHERE Name='SFDC Computing'

La cláusula WHERE puede contener varias condiciones que se agrupan mediante


operadores lógicos (AND, OR) y paréntesis. Por ejemplo, esta consulta devuelve
todas las cuentas con el nombre SFDC Computing y más de 25 empleados:

SELECT Name,Phone FROM Account WHERE (Name='SFDC Computing' AND


NumberOfEmployees>25)

Este es otro ejemplo con una condición más compleja. Esta consulta devuelve
todas las cuentas SFDC Computing o todas las cuentas con más de 25 empleados
cuya ciudad de facturación es Los Angeles.

SELECT Name,Phone FROM Account WHERE (Name='SFDC Computing' OR


(NumberOfEmployees>25 AND BillingCity='Los Angeles'))

Más allá de lo básico


En lugar de usar el operador de igualdad ( = ) para la comparación, puede
establecer coincidencias aproximadas mediante el operador LIKE . Por ejemplo,
puede recuperar todas las cuentas cuyos nombres empiecen por SFDC mediante
esta condición: WHERE Name LIKE 'SFDC%' . El carácter comodín % coincide con
cualquier o ningún carácter. Por el contrario, el carácter _ se puede usar para
establecer la coincidencia con tan solo un carácter.

Ordenación de resultados de consulta


Dado que cuando se ejecuta una consulta, devuelve registros de Salesforce sin
ningún orden en concreto, no puede esperar que el orden de los registros del
conjunto devuelto sea el mismo cada que vez que se ejecuta la consulta. No
obstante, puede elegir el orden en el que se devuelve el conjunto de registros si
agrega una cláusula ORDER BY y especifica el campo según el cual se va a
ordenar el conjunto de registros. En este ejemplo se ordenan todas las cuentas
recuperadas según el campo Name.
SELECT Name,Phone FROM Account ORDER BY Name

El orden predeterminado es el orden alfabético, el cual se especifica como ASC.


La declaración anterior es equivalente a:

SELECT Name,Phone FROM Account ORDER BY Name ASC

Para invertir el orden, use la palabra clave DESC para aplicar el orden
descendente:

SELECT Name,Phone FROM Account ORDER BY Name DESC

Puede ordenar la mayoría de los campos, incluidos los campos numéricos y de


texto. No puede ordenar campos de texto enriquecido ni listas de selección
múltiple.

Combinación de todos los elementos


Puede combinar las cláusulas opcionales en una sola consulta en el orden
siguiente:

SELECT Name,Phone FROM Account

WHERE (Name = 'SFDC Computing' AND


NumberOfEmployees>25)

ORDER BY Name

LIMIT 10

Copy

Ejecute la siguiente consulta SOQL en Apex mediante la ventana de ejecución


anónima de Developer Console. A continuación, inspeccione las declaraciones
debug del registro de depuración. Se debe devolver una cuenta de ejemplo.

Account[] accts = [SELECT Name,Phone FROM Account

WHERE (Name='SFDC Computing' AND NumberOfEmployees>25)

ORDER BY Name

LIMIT 10];

System.debug(accts.size() + ' account(s) returned.');


// Write all account array info

System.debug(accts);

Acceso a variables en consultas SOQL


Las declaraciones SOQL de Apex pueden hacer referencia a variables y
expresiones de código Apex si van precedidas de dos puntos (:). El uso de una
variable local en una declaración SOQL se llama enlace.

En este ejemplo se muestra cómo usar la variable targetDepartment en la cláusula


WHERE.

String targetDepartment = 'Wingo';

Contact[] techContacts = [SELECT FirstName,LastName

FROM Contact WHERE


Department=:targetDepartment];

ara obtener registros secundarios relacionados con un registro principal, agregue


una consulta interna para los registros secundarios. La cláusula FROM de la
consulta interna se ejecuta según el nombre de la relación en lugar de un nombre
de objeto de Salesforce. Este ejemplo incluye una consulta interna para obtener
todos los contactos asociados a cada cuenta devuelta. La cláusula FROM
especifica la relación Contacts, que es una relación predeterminada de la cuenta
que vincula cuentas y contactos.

SELECT Name, (SELECT LastName FROM Contacts) FROM Account WHERE Name =
'SFDC Computing'

Copy

Consulta de registros por lotes mediante SOQL para bucles


En el caso de un bucle for de SOQL, puede incluir una consulta SOQL en un
bucle for . Los resultados de una consulta SOQL pueden iterar en el bucle. Los
bucles for de SOQL usan un método distinto para recuperar registros (los registros
se recuperan mediante la fragmentación eficiente con llamadas a la consulta y
métodos queryMore de la API SOAP. Con los bucles for de SOQL, puede evitar
alcanzar el límite de tamaño de la pila.

El bucle for de SOQL itera sobre todos los registros sObject devueltos por una
consulta SOQL. La sintaxis de un bucle for de SOQL es:
for (variable : [soql_query]) {

code_block

Copy
O bien:

for (variable_list : [soql_query]) {

code_block

Copy

Tanto variable como variable_list deben ser del mismo tipo que los sObjects
devueltos por soql_query .

Es preferible usar el formato de lista de sObjects del bucle for de SOQL, ya que el bucle for
se ejecuta una vez para cada lote de 200 sObjects. Esto le permite trabajar con lotes de
registros y realizar operaciones DML por lotes, lo que permite evitar alcanzar los límites
regulados.

insert new Account[]{new Account(Name = 'for loop 1'),

new Account(Name = 'for loop 2'),

new Account(Name = 'for loop 3')};

// The sObject list format executes the for loop once per returned batch

// of records

Integer i=0;

Integer j=0;

for (Account[] tmp : [SELECT Id FROM Account WHERE Name LIKE 'for loop
_']) {

j = tmp.size();

i++;
}

System.assertEquals(3, j); // The list should have contained the three


accounts

// named 'yyy'

System.assertEquals(1, i); // Since a single batch can hold up to 200


records and,

// only three records should have been returned,


the

// loop should have executed only once

Sintaxis de desencadenadores
La sintaxis de una definición de desencadenador es distinta de la sintaxis de una
definición de clase. La definición de un desencadenador empieza por la palabra
clave trigger . A continuación, le siguen el nombre del desencadenador, el objeto
de Salesforce con el que está asociado el desencadenador y las condiciones en
las que este se activa. Un desencadenador tiene la siguiente sintaxis:

trigger TriggerName on ObjectName (trigger_events) {

code_block

Copy
Para ejecutar un desencadenador antes o después de operaciones de inserción,
actualización, eliminación y recuperación, especifique varios eventos de
desencadenador en una lista separada por comas. Los eventos que se pueden
especificar son:

 before insert
 before update
 before delete
 after insert
 after update
 after delete
 after undelete
visualforce
An Example Visualforce Page

Here’s a short example of a working Visualforce page.

<apex:page standardController="Contact" >

<apex:form >

<apex:pageBlock title="Edit Contact">

<apex:pageBlockSection columns="1">

<apex:inputField value="{!Contact.FirstName}"/>

<apex:inputField value="{!Contact.LastName}"/>

<apex:inputField value="{!Contact.Email}"/>

<apex:inputField value="{!Contact.Birthdate}"/>

</apex:pageBlockSection>

<apex:pageBlockButtons >

<apex:commandButton action="{!save}" value="Save"/>

</apex:pageBlockButtons>

</apex:pageBlock>

</apex:form>

</apex:page>

Potrebbero piacerti anche