Documentos de Académico
Documentos de Profesional
Documentos de Cultura
#salesforce
Tabla de contenido
Acerca de 1
Observaciones 2
Examples 2
Instalación o configuración 2
Productos Salesforce 2
Nube de ventas 2
Nube de servicios 2
Nube de marketing 2
Nube comunitaria 2
App Cloud 3
Nube de IoT 3
Nube de salud 3
Heroku 3
Observaciones 4
Introducción 4
Examples 5
Creación 5
administración 5
Configuración personalizada 6
Regla de validación 8
Reglas de flujo de trabajo 9
Explicación 9
Clase de Apex 9
Prueba de unidad 9
Examples 16
Afirmar métodos 16
Utilizando testSetup 17
Metodos de afirmacion 18
Sintaxis 19
Parámetros 19
Examples 19
Disparador basico 19
Introducción 22
Examples 22
Examples 23
Bulkificación 23
Examples 24
Pagina basica 24
IDEs 26
Extensiones de navegador 26
Depuradores 26
Sintaxis 28
Examples 28
Consulta de SOQL para hacer referencia a los campos del objeto principal 29
Usando un Semi-Join 31
SOQL dinámico 31
Examples 32
Capítulo 11: Navegación de la página con la ayuda de la clase envoltura de lista en la fue 33
Introducción 33
Examples 33
Controlador de paginación 33
Observaciones 37
Examples 38
ProcesoDefinición 38
ProcessNode 39
ProcessInstance 39
ProcessInstanceStep & ProcessInstanceWorkitem 39
ProcessInstanceHistory * 40
Introducción 41
Examples 41
Examples 43
Introducción 44
Examples 44
Información de usuario 44
Examples 45
$ Recurso 45
$ Etiqueta 45
$ Usuario 45
Creditos 46
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: salesforce
It is an unofficial and free Salesforce ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official Salesforce.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con Salesforce
Observaciones
Esta sección proporciona una descripción general de qué es Salesforce y por qué un
desarrollador puede querer usarlo.
También debe mencionar cualquier tema importante dentro de la fuerza de ventas y vincular a los
temas relacionados. Dado que la Documentación para salesforce es nueva, es posible que deba
crear versiones iniciales de los temas relacionados.
Examples
Instalación o configuración
La mejor manera de comenzar con Salesforce es obtener su propia Edición para desarrolladores.
Developer Edition (a menudo denominado "DE org") es un entorno de desarrollo con todas las
funciones con límites en cuanto a datos y usuarios. Developer Edition es donde puede
familiarizarse con el entorno, probar cosas y jugar en Salesforce.com. Developer Edition es un
entorno que le permite comenzar a desarrollar, probar y desplegar instantáneamente su
aplicación en la nube.
Productos Salesforce
La aplicación Salesforce consta de varios productos que pueden integrarse entre sí:
Nube de ventas
Página de Marketing , Documentación Salesforce
Nube de servicios
Página de marketing , documentación de Salesforce , Trailhead
Nube de marketing
Página de Marketing
Nube comunitaria
Página de Marketing , Documentación Salesforce
https://riptutorial.com/es/home 2
Analytics Cloud aka Wave Analytics
Página de marketing , documentación de Salesforce , Trailhead
App Cloud
Página de Marketing
Nube de IoT
Página de Marketing
Nube de salud
Página de Marketing , Documentación Salesforce
Heroku
Página de Marketing
https://riptutorial.com/es/home 3
Capítulo 2: Ajustes personalizados
Observaciones
Introducción
A diferencia de los objetos personalizados que tienen registros basados en ellos, la configuración
personalizada le permite utilizar conjuntos de datos personalizados en su organización, o
distinguir usuarios particulares o perfiles según criterios personalizados. Esto significa, por
ejemplo, que los administradores pueden editar las configuraciones personalizadas de la jerarquía
para desactivar las Reglas de flujo de trabajo / validación para usuarios individuales o perfiles, sin
tener que desactivarlas para toda la organización (consulte el ejemplo Uso de las configuraciones
personalizadas de la jerarquía para desactivar las Reglas de flujo de trabajo / validación arriba) ).
• El código está actualizando los registros antiguos, que se editaron por última vez antes de
que se activara una regla de validación y, por lo tanto, no cumplen con los criterios de la
regla más reciente.
• El código es insertar nuevos registros sin los valores requeridos por los criterios de una
regla de validación.
• Activarían una alerta por correo electrónico o una actualización de campo que sobrescribiría
o interferiría con los cambios que está realizando en el registro.
El uso de una configuración personalizada otorga a los administradores cierto control declarativo
sobre el código, por lo que uno de los muchos casos de uso es que, cuando se utiliza, puede
hacer que no sea necesario implementar el código para deshabilitar los desencadenantes
(consulte el ejemplo de Uso de la configuración de jerarquía personalizada para deshabilitar el
código de Apex). ).
Un beneficio clave para los desarrolladores es que los datos de configuración personalizada se
exponen en el caché de la aplicación, lo que permite un acceso eficiente sin el costo de consultas
repetidas a la base de datos. Estos datos pueden ser utilizados por campos de fórmula, reglas de
validación, flujos, Apex y la API SOAP; consulte la documentación de Salesforce .
https://riptutorial.com/es/home 4
promoviendo el uso de Tipos de metadatos personalizados, en lugar de Listar configuraciones
personalizadas.
Cuando vaya a crear una nueva configuración personalizada, se mostrará el siguiente mensaje
Examples
Creación y gestión de configuraciones personalizadas
Creación
Para crear una configuración personalizada, vaya a:
Clásico
Configuración> Desarrollar> Configuraciones personalizadas> Nuevo
Relámpago
Configuración> Código personalizado> Configuración personalizada> Nuevo
Cree su configuración (consulte las Observaciones más adelante en este documento para ver las
diferencias entre las configuraciones personalizadas de Jerarquía y Lista). Puede ignorar la lista
de selección Visibilidad, a menos que planee implementar su configuración en un paquete
administrado.
Para crear los campos de configuración, haga clic en el botón Nuevo y siga el proceso habitual
para crear un campo personalizado.
administración
Una vez que haya creado su (s) campo (s), puede comenzar a configurar la configuración
haciendo clic en el botón Administrar.
Es más fácil administrar la configuración si crea una nueva vista e incluye cualquier campo que
haya creado para brindarle una visión general completa de la configuración, de un vistazo. El
propietario de la instalación es el usuario o el perfil al que se aplica la configuración.
https://riptutorial.com/es/home 5
Para administrar la configuración en el nivel de organización, haga clic en el botón Nuevo sobre el
encabezado Valor de nivel de organización predeterminado (en el cuadro rojo a continuación).
Para administrar la configuración a nivel de usuario o perfil, haga clic en el botón Nuevo en el
cuadro azul a continuación.
Configuración personalizada
https://riptutorial.com/es/home 6
Campo de configuración personalizada
https://riptutorial.com/es/home 7
o, en este ejemplo, su perfil:
Regla de validación
AND(
/* the below is the reference to the Val_Rule_Cntrlr__c custom setting's checkbox field
All_Opportunity_Disabled__c
*/
$Setup.Val_Rule_Cntrlr__c.All_Opportunity_Disabled__c = FALSE,
https://riptutorial.com/es/home 8
En la regla anterior, ambos criterios deben evaluarse en TRUE para que se TRUE la regla.
Explicación
En este ejemplo, se creó un Desencadenador simple para cambiar la Fecha de Cierre de una
Oportunidad, que está a punto de insertarse o actualizarse, a una fecha de 10 días en el futuro.
Clase de Apex
Id userId;
Apx_Cntrlr__c userApexController;
Boolean userSetting;
userId = userinfo.getUserId();
userApexController = Apx_Cntrlr__c.getInstance(userId);
userSetting = userApexController.Close_Date_Update_Disabled__c;
if (userSetting == false) {
for(Opportunity opp : Trigger.new) {
opp.CloseDate = date.today().addDays(10);
}
}
Prueba de unidad
@isTest
public class CloseDateUpdateTest {
@testSetup
static void dataSetup() {
Profile p = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
https://riptutorial.com/es/home 9
User u = new User(LastName = 'Test',Alias = 't1',Email = 'example@gmail.com',Username
= 'sotest@gmail.com',ProfileId = p.Id,TimeZoneSidKey = 'America/Denver',LocaleSidKey =
'en_US',EmailEncodingKey = 'UTF-8',LanguageLocaleKey = 'en_US');
insert u;
}
test.startTest();
system.runAs(u){
for(Opportunity o : opportunities2){
system.assertEquals(date.today().addDays(10), o.closeDate, 'CloseDateUpdate
trigger should have changed the Opportunity close date as it was not disabled by the
apexController custom setting');
}
}
test.startTest();
system.runAs(u){
https://riptutorial.com/es/home 10
insert opportunities1;
}
test.stopTest();
for(Opportunity o : opportunities2){
system.assertEquals(date.today().addDays(1), o.closeDate, 'CloseDateUpdate trigger
should not have changed the Opportunity close date as it was disabled by the apexController
custom setting');
}
}
En el código a continuación, he creado una Clase de Apex programable que actualizará la Fecha
de cierre de cualquier oportunidad cuya Fecha de cierre sea inferior o igual a 6 días a partir de la
fecha actual, cambiando la fecha a 20 días en el futuro.
Id userId;
Val_Rule_Cntrlr__c setting;
Boolean validationRulesAlreadyDisabled;
List<Opportunity> processedOpps = new List<Opportunity>();
Date d;
https://riptutorial.com/es/home 11
}
d = system.today().addDays(6);
if (processedOpps.size() > 0) {
update processedOpps;
}
Para asegurarme de que mis reglas de validación están siendo desactivadas por los cambios en
mi configuración personalizada en mi clase, he creado un campo de casilla de verificación
Trigger_Validation_Rule__c (que no sería visible para los usuarios o agregado a los diseños de
página) y una regla de validación con este criterio:
AND(
$Setup.Val_Rule_Cntrlr__c.All_Opportunity_Disabled__c = FALSE,
Trigger_Validation_Rule__c = TRUE,
/* allow the above criteria to be met while inserting the Opportunities, without triggering
the rule, in the @testSetup portion of the test */
NOT(ISNEW())
)
Luego, establezco el campo de la casilla de verificación en true al crear mis Oportunidades para
que se cumplan los criterios de las reglas, si el campo de configuración personalizada no es
editado por mi código.
@isTest
private class WE_ScheduledCloseDateUpdateTest {
@testSetup
static void dataSetup() {
Profile p = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
https://riptutorial.com/es/home 12
= 'sotest@gmail.com',ProfileId = p.Id,TimeZoneSidKey = 'America/Denver',LocaleSidKey =
'en_US',EmailEncodingKey = 'UTF-8',LanguageLocaleKey = 'en_US');
insert u;
Test.startTest();
System.assertEquals(CRON_EXP, ct.CronExpression);
System.assertEquals(0, ct.TimesTriggered);
System.assertEquals('2022-03-15 00:00:00', String.valueOf(ct.NextFireTime));
Test.stopTest();
https://riptutorial.com/es/home 13
// test results
Integer updateCount = 0;
Integer skipCount = 0;
for(Opportunity o : opportunitys) {
if (o.Name.contains('Update') &&
updateCount == 0)
{
System.assertEquals(date.today().addDays(20), o.CloseDate, 'Opportunity\'s
Close Date should have been updated as it was less than 7 days away');
updateCount = 1;
}
if (o.Name.contains('Skip') &&
skipCount == 0)
{
System.assertEquals(date.today().addDays(15), o.CloseDate, 'Opportunity should
not have been updated as it\'s Close Date is more than 7 days away');
skipCount = 1;
}
}
// check that both lists of Opportunities have been tested
System.assertEquals(2, updateCount + skipCount, 'Count should be 2 once all assertions
have been executed');
// check that the class does not change the custom setting's field to false, if it was
true before class was executed
static testmethod void testSettingUpdates() {
// switch the custom setting field to true before the scheduled job executes
Val_Rule_Cntrlr__c setting;
setting = Val_Rule_Cntrlr__c.getInstance(u.Id);
setting.All_Opportunity_Disabled__c = true;
upsert setting;
System.runAs(u) {
Test.startTest();
System.assertEquals(CRON_EXP, ct.CronExpression);
System.assertEquals(0, ct.TimesTriggered);
System.assertEquals('2022-03-15 00:00:00', String.valueOf(ct.NextFireTime));
Test.stopTest();
}
setting = Val_Rule_Cntrlr__c.getInstance(u.Id);
https://riptutorial.com/es/home 14
// check that the class did not change the All_Opportunity_Disabled__c field to false
System.assertEquals(true, setting.All_Opportunity_Disabled__c);
}
https://riptutorial.com/es/home 15
Capítulo 3: Apex Testing
Examples
Afirmar métodos
delete allContacts;
allContacts = [SELECT Id FROM Contact];
System.assertEquals(0, allContacts.size());
}
Como se puede ver, este método es simplemente una instrucción if con tres ramas. Para escribir
una clase de prueba efectiva, debemos cubrir cada rama con código y usar las
System.assertEquals(...) para verificar que se recibió la información correcta de IsBlank(...) .
@isTest
public class SomeClass_test {
@isTest
public static void SomeClass_IsBlank_test() {
https://riptutorial.com/es/home 16
String testData;
testData = '';
testData = 'someData';
Utilizando testSetup
Puede usar un método anotado con @testSetup para escribir el código que se habrá ejecutado
antes de cada ejecución de prueba:
@isTest
public class AccountServiceTest {
private static final String TEST_ACCOUNT_NAME = 'My Test Account';
@testSetup
public static void setUpAccountData() {
Account a = new Account(Name = TEST_ACCOUNT_NAME);
}
@isTest
public static void testFetchAccount() {
Account a = AccountService.fetchAccount();
System.assertNotEquals(null, a, 'Account should not be null');
System.assertEquals(TEST_ACCOUNT_NAME, a.Name, 'Account name should be correct');
}
}
Si bien puede usar la anotación @testSetup para designar un método que se ejecutará antes de
que se ejecuten las pruebas, este método generalmente solo se ejecutará una vez. Si necesita
que el código se ejecute antes de cada prueba, puede usar un bloque static :
@isTest
https://riptutorial.com/es/home 17
public class MyTest {
static {
// code here will be run before each test is executed
}
}
Metodos de afirmacion
System.assert se puede usar para verificar que una expresión booleana se evalúe como
verdadera:
System.assert(Service.isActive());
System.assert(!Service.getItems().isEmpty(), 'items should not be empty');
System.assertEquals(4, Service.getItems().size());
System.assertNotEquals(null, Service.getItems());
https://riptutorial.com/es/home 18
Capítulo 4: Apex Triggers
Sintaxis
• desencadenar < nombre > en < nombre de api de objeto > (< eventos >) {// su lógica de
desencadenante}
Parámetros
parámetro descripción
nombre-api- Objeto sobre el que disparará el gatillo. Puede ser cualquier objeto estándar
objeto o personalizado.
Eventos que dispararán el gatillo. Son una combinación de before / after con
eventos cualquiera de insert / update / delete . También hay after undelete sin before
contraparte.
Examples
Disparador basico
https://riptutorial.com/es/home 19
//Returns true if trigger is undelete
System.debug('Trigger:DML:Undelete: ' + Trigger.isUndelete);
https://riptutorial.com/es/home 20
if (theNewOne.Name != theOldOne.Name) {
System.debug('The name of ' + key + ' has been changed');
}
}
}
}
https://riptutorial.com/es/home 21
Capítulo 5: API REST de Salesforce
Introducción
Force.com Documentación API REST. La lista completa de API's está aquí.
Examples
OAuth2 access_token y lista de servicios
{
"access_token":
"00D6F0xxx001g1qs!ARsAQL7BRiQQ0lgTW7zXu3kILJBxxxxxHvDnChF2ETBFJpX0T2LsBsm8MVABhAvINAyZqgDIAHhJDp6QjuF6Z
"instance_url": "https://ap4.salesforce.com",
"id": "https://login.salesforce.com/id/00D6F000001xxxxAA/0056F000006DMcxxxx",
"token_type": "Bearer",
"issued_at": "14878401xxxxx",
"signature": "Ra5Sdm6gq4xxxeZYk3H2yBIVpZ6hBUDgkQ4Tjp9Q="
}
Entonces hazlo
{
"tooling": "/services/data/v20.0/tooling",
"eclair": "/services/data/v20.0/eclair",
"prechatForms": "/services/data/v20.0/prechatForms",
"async-queries": "/services/data/v20.0/async-queries",
"query": "/services/data/v20.0/query",
"chatter": "/services/data/v20.0/chatter",
"wave": "/services/data/v20.0/wave",
"search": "/services/data/v20.0/search",
"identity": "https://login.salesforce.com/id/00D6F000001g1qsUAA/0056F000006DMcMQAW",
"sobjects": "/services/data/v20.0/sobjects",
"serviceTemplates": "/services/data/v20.0/serviceTemplates",
"recent": "/services/data/v20.0/recent",
"connect": "/services/data/v20.0/connect",
"licensing": "/services/data/v20.0/licensing"
}
https://riptutorial.com/es/home 22
Capítulo 6: Bulkificación del gatillo
Examples
Bulkificación
Si realiza el procesamiento fila por fila en Salesforce, probablemente alcanzará el límite del
gobernador rápidamente. Esto es especialmente cierto con los factores desencadenantes y las
cosas que se activan cuando no los espera. Un método documentado de escapar del límite del
gobernador es la masificación.
Acumular el código de Apex significa asegurarse de que el código maneja correctamente más de
un registro a la vez. Cuando un lote de registros inicia Apex, se ejecuta una sola instancia de ese
código de Apex, pero esa instancia necesita manejar todos los registros en ese lote dado.
No Bulkified:
Bulkified:
https://riptutorial.com/es/home 23
Capítulo 7: Desarrollo de la página de
Visualforce
Examples
Pagina basica
<apex:page>
<h1>Hello, world!</h1>
</apex:page>
Si su página es para mostrar o editar información sobre un tipo particular de registro, puede ser
útil usar un controlador estándar para reducir la cantidad de código de boiler que necesita escribir.
<apex:page standardController="Account">
This is a page for {!Account.Name}
</apex:page>
<apex:page standardController="Account">
Name: <apex:inputField value="{!Account.Name}" />
<apex:commandButton value="Update record" action="{!save}" />
</apex:page>
https://riptutorial.com/es/home 24
https://riptutorial.com/es/salesforce/topic/6372/desarrollo-de-la-pagina-de-visualforce
https://riptutorial.com/es/home 25
Capítulo 8: Herramientas para el desarrollo
Examples
IDEs
Una lista de IDE disponibles para crear clases, desencadenadores, páginas / componentes de
Visualforce / Lightning.
Extensiones de navegador
Depuradores
• Traje welkin
https://riptutorial.com/es/home 26
○ Registro de depuración de depuración
○ IDE independiente
○ Se requiere suscripción
• Nube Iluminada :
• Salesforce DataLoader
• Dataloader.io
• Jitterbit
• SFXOrgData
• DreamFactory Monarch
• Pentaho Tetera
• Talend
https://riptutorial.com/es/home 27
Capítulo 9: Lenguaje de consulta de objetos
de Salesforce (SOQL)
Sintaxis
• SELECCIONAR ID DE Cuenta
• SELECCIONAR ID, Nombre DESDE cuenta
• SELECCIONE ID DE LA Cuenta DONDE Nombre = 'SomeAccountName'
• SELECCIONE ID, Nombre, (SELECCIONE ID, Nombre DE Contactos) DESDE Cuenta
• SELECCIONE ID, nombre DESDE la cuenta DONDE Id =: apexVariableName
Examples
Consulta SOQL básica
Esto devolverá los campos Id y Nombre de la tabla de la Cuenta. No se aplicará ningún filtrado o
clasificación.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Esto devolverá Leads con un número de teléfono que coincida con el formato especificado. "%"
actúa como un carácter comodín.
Usar LIKE '% %' también permite que un desarrollador replique una fórmula CONTAINS( ) .
https://riptutorial.com/es/home 28
Devolverá los prospectos con una fuente principal que contenga Google, es decir, "AdWords de
Google" y "Búsqueda natural de Google".
SELECT Name, Title FROM User ORDER BY Title ASC NULLS FIRST
SELECT Id FROM Contact ORDER BY LastName ASC NULLS LAST, FirstName ASC NULLS FIRST
Una característica muy útil que muchas personas pasan por alto es la capacidad de construir un
mapa usando una consulta SOQL.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Cuando ejecuta este código, las accounts contienen un mapa de los objetos de su cuenta, con la
clave de identificación. La salida al registro de depuración se vería similar a esto:
Ahora puede buscar los objetos de la Cuenta utilizando su Id. Además, si desea una colección de
ID únicas, puede llamar a la función keySet() de la clase Map, así:
System.debug(accounts.keySet());
Esto es muy útil cuando necesita consultar para obtener registros y acceder a ellos repetidamente
en su código.
Consulta de SOQL para hacer referencia a los campos del objeto principal
Cuando los objetos están vinculados por una relación de búsqueda o detalle maestro, los campos
de registros primarios pueden ser referenciados desde el registro secundario o "objeto base" en
una consulta. Esto también se conoce como travesía hacia arriba.
https://riptutorial.com/es/home 29
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Cuando el objeto base es un campo de búsqueda personalizado, el __c en el nombre del campo
Primary_Influencer__c, por ejemplo, se cambiará a __r.
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Para realizar una consulta en Apex, rodee la consulta entre corchetes. El resultado se puede
asignar a una lista, o a un solo objeto.
Para hacer referencia a una variable en una consulta, agregue dos puntos (:) antes del nombre de
la variable.
Cuando se asigna a un solo objeto, una consulta que devuelve algo que no sea una sola fila
arrojará una QueryException .
try {
Account a = [SELECT Id FROM Account WHERE Name = 'Non-existent Account'];
} catch (QueryException e) {
// List has no rows for assignment to SObject
}
try {
Account a = [SELECT Id FROM Account];
} catch (QueryException e) {
// List has more than 1 row for assignment to SObject
https://riptutorial.com/es/home 30
}
Usando un Semi-Join
Seleccionar todas las cuentas que tienen registros de oportunidades abiertas debajo de ellas
SOQL dinámico
Puede ejecutar una consulta de base de datos desde una cadena en lugar de una expresión
SOQL regular:
Dado que las consultas dinámicas de SOQL no se compilan, sus referencias de esquema no se
validan, por lo que es preferible utilizar la interpolación de variables de Apex utilizando la sintaxis
:variable cuando sea posible.
https://riptutorial.com/es/home 31
Capítulo 10: Manipulación de fecha y hora
Examples
Encuentra fácilmente el último día de un mes
Si necesita encontrar el último día del mes, puede hacer gimnasia complicada con DateTime o
puede usar el siguiente método.
Digamos que quieres encontrar el último día de febrero de 2021. Haz lo siguiente:
Integer month = 2;
Integer day = null;
Integer year = 2021;
// Create a new DateTime object for the first day of the month following
// the date you're looking for.
DateTime dtTarget = DateTime.newInstance(year, month, 1);
//In this case we would be sure that month would not be out of bound
dtTarget = dtTarget.addMonths(1);
// Then use the .addDays() method to add negative 1 days. This gives you
// the last day of the target month.
DateTime lastDayOfMonth = dtTarget.addDays(-1);
day = lastDayOfMonth.day();
System.debug(lastDayOfMonth);
System.debug(day);
Esto funciona para todos los métodos de adición, lo que le permite encontrar DateTimes de forma
fácil y rápida en el pasado.
https://riptutorial.com/es/home 32
Capítulo 11: Navegación de la página con la
ayuda de la clase envoltura de lista en la
fuerza de ventas.
Introducción
Slaesforce StandardSetController solo mantiene la lista de sObject, no contiene la lista de objetos
de la clase contenedora. A continuación, el código fuente muestra el uso de Paginating utilizando
Wrapper Class en sales-force.
Examples
Controlador de paginación
Voy a mostrar todos los contactos en forma de paginación y debería haber una casilla de
verificación para cada contacto a seleccionar o deseleccionar contacto para realizar una
operación de eliminación en los contactos. Así que necesito crear una clase de contenedor para
mantener el contacto y la variable booleana para la selección. Primero cree la clase Wrapper para
el controlador Paginación Inserte debajo del código en el controlador de paginación.
https://riptutorial.com/es/home 33
public final Integer Page_Size=10; // Number records in a Page should be displayed
Ahora tiene los contactos en la variable setCon, siempre que solicite setCon.getRecords (),
recuperará los primeros 10 registros de contacto de la setCon. Aquí tengo crear una clase
envoltura simple para mostrarle la demostración. Puede crear su propia clase de envoltura según
el requisito. Pero siempre debe tener en cuenta que ApexPages.StandardSetController contiene
solo la Lista de sObject, no contendrá la lista de objetos de la clase de contenedor. Esa es la
razón por la que he escrito un código adicional a continuación para lograr este futuro de manera
diferente. A continuación, el código convierte la lista de contactos en una lista de objetos de la
clase envoltura, de modo que, cuando llame a los contactos en la página de fuerza visual, recibirá
la lista de objetos de la clase envoltura.
public Pagination() {
selectedContactIds=new set<id>();
}
Ahora ha escrito un código para generar resultados. ¿Pero cómo navegar por la página? Esto se
puede hacer con un paso sencillo con ApexPages.StandardSetController. Mire la siguiente
belleza del código del StandardSetController, No es necesario mantener el número de página, el
desplazamiento y el límite, etc. Solo use los métodos del StandardSetController. Copie el
siguiente código en el controlador de paginación.
https://riptutorial.com/es/home 34
}
set;
}
public Boolean hasPrevious {
get {
return setCon.getHasPrevious();
}
set;
}
Ya casi terminas con Paginar los contactos. Últimos pocos métodos que he agregado para
cumplir con toda la funcionalidad de mi página. Como mencioné anteriormente, tenemos una
casilla de verificación adicional para seleccionar un contacto y realizar una operación de
eliminación en los contactos seleccionados.
https://riptutorial.com/es/home 35
// related contact ,include try block to avoid
error.
catch(exception ex){ System.debug(ex); }
refresh();
}
}
Lea Navegación de la página con la ayuda de la clase envoltura de lista en la fuerza de ventas. en
línea: https://riptutorial.com/es/salesforce/topic/10744/navegacion-de-la-pagina-con-la-ayuda-de-
la-clase-envoltura-de-lista-en-la-fuerza-de-ventas-
https://riptutorial.com/es/home 36
Capítulo 12: Procesos de aprobación de
objetos
Observaciones
El Proceso de aprobación es una característica muy sorprendente en Salesforce para automatizar
el proceso de negocios. Un proceso de aprobación es un conjunto de los pasos necesarios para
que un aprobador o un conjunto de aprobadores aprueben o rechacen un registro en particular.
Un paso puede aplicarse a todos los registros incluidos en el proceso, o solo a registros que
cumplan con ciertos criterios definidos por el administrador. Un proceso de aprobación también
especifica las acciones a tomar cuando un registro se aprueba, rechaza, recupera o envía por
primera vez para su aprobación.
https://riptutorial.com/es/home 37
Examples
ProcesoDefinición
Representa la definición de un proceso de aprobación único. Utilice este objeto para leer la
descripción de un proceso de aprobación. La definición es de solo lectura. No podemos modificar
el registro creado en ProcessDefinition Object. Pero podemos describir, consultar, buscar y
recuperar la información de los procesos de aprobación.
~ Consulta ~
SELECT CreatedById,CreatedDate,Description,DeveloperName,LastModifiedById,
LastModifiedDate,LockType,Name,State,SystemModstamp,TableEnumOrId,Type,Id
https://riptutorial.com/es/home 38
FROM ProcessDefinition
Los registros se crean cuando creamos un nuevo proceso de aprobación utilizando la interfaz de
usuario de Salesforce del Proceso de aprobación.
ProcessNode
~ Consulta ~
SELECT Description,DeveloperName,Name,ProcessDefinitionId,SystemModstamp
,Id,FROM ProcessNode
Como podemos ver, el campo ProcessDefinitionId actúa como una clave externa que se refiere al
objeto o tabla ProcessDefinition para los pasos o nodos de proceso que se crean. Este objeto
también se lee solo como objeto ProcessDefinition.
ProcessInstance
~ Consulta ~
SELECT CompletedDate,CreatedById,CreatedDate,ElapsedTimeInDays,
ElapsedTimeInHours,ElapsedTimeInMinutes,Id,IsDeleted,LastActorId,
LastModifiedById,LastModifiedDate,ProcessDefinitionId,Status,
SubmittedById,SystemModstamp,TargetObjectId FROM ProcessInstance
Todos los campos ProcessInstance se rellenan automáticamente una vez que el registro se envía
para su aprobación, con dos campos de excepciones: CompletedDate y LastActorId que se
completan solo después de que se completa la instancia del proceso de aprobación. El campo
ProcessDefinitionId es el ID de referencia o clave externa del objeto ProcessDefinition.
https://riptutorial.com/es/home 39
aprobación y los elementos de trabajo.
~ Consulta ~
SELECT CreatedById,CreatedDate,ElapsedTimeInDays,ElapsedTimeInHours,
ElapsedTimeInMinutes,Id,IsDeleted,OriginalActorId,ProcessInstanceId,
ActorId,SystemModstamp FROM ProcessInstanceWorkitem
SELECT ActorId,Comments,CreatedById,CreatedDate,ElapsedTimeInDays,Id,
ElapsedTimeInHours,ElapsedTimeInMinutes,OriginalActorId,ProcessInstanceId
,StepNodeId,StepStatus,SystemModstamp FROM ProcessInstanceStep
ProcessInstanceHistory *
~ Consulta ~
https://riptutorial.com/es/home 40
Capítulo 13: SalesForce Integración CI
Introducción
Lugar para usar Jenkins y Sonar para CI
Examples
¿Cómo configurar Jenkins para implementar código en desarrollo o
producción org?
Cómo podemos usar jenkins en nuestro desarrollo de productos SalesForce. ¿Cuáles son los
complementos de herramientas disponibles para la integración de Jenkins? ¿Cómo resolver el
problema de configuración de CI? Etc.
https://riptutorial.com/es/home 41
Lea SalesForce Integración CI en línea:
https://riptutorial.com/es/salesforce/topic/10044/salesforce-integracion-ci
https://riptutorial.com/es/home 42
Capítulo 14: Trabajando con Sistemas
Externos
Examples
Hacer una llamada saliente
Este es un ejemplo de cómo llamar a un servicio web de salesforce. El siguiente código está
llamando a un servicio basado en REST alojado en data.gov para encontrar mercados de
agricultores cerca del código postal.
Recuerde que para invocar una llamada HTTP de su organización, debe modificar la
configuración remota de la organización.
https://riptutorial.com/es/home 43
Capítulo 15: Variables globales en las clases
Introducción
En este tema me gustaría mencionar todas las posibles variables globales que se pueden usar en
el código Apex. Me gusta [UserInfo Class] [1]. Sugiero que simplemente listemos clases /
variables globales y enlaces. Si conoce una clase / variable global pero no puede encontrar una
documentación, proporcione la mayor cantidad de información posible. [1]:
https://developer.salesforce.com/docs/atlas.en-
us.apexcode.meta/apexcode/apex_methods_system_userinfo.htm
Examples
Información de usuario
https://riptutorial.com/es/home 44
Capítulo 16: Variables globales en las
páginas de Visualforce
Examples
$ Recurso
Se puede usar junto con la función URLFOR para hacer referencia a archivos dentro de un recurso
estático comprimido:
$ Etiqueta
La variable $Label se puede usar para mostrar el texto definido en sus etiquetas personalizadas.
También puedes hacer formateo con etiquetas. Supongamos que tiene una etiqueta
personalizada llamada Welcome_Message definida como
<apex:outputText value="{!$Label.Welcome_Message}"
rendered="{!NOT(ISBLANK($User.ContactId))}">
<apex:param value="{!$User.Contact.FirstName}" />
</apex:outputText>
$ Usuario
La variable $User le da acceso a todos los campos estándar y personalizados en el objeto User
para el usuario que ha iniciado sesión actualmente.
https://riptutorial.com/es/home 45
Creditos
S.
Capítulos Contributors
No
Empezando con
1 abhi, Alex S, Andrii Muzychuk, Ashwani, Community, Reshma
Salesforce
Ajustes
2 Alex S
personalizados
API REST de
5 radbrawler
Salesforce
Bulkificación del
6 abhi, hillary.fraley, LDP
gatillo
Desarrollo de la
7 página de Ben
Visualforce
Lenguaje de
consulta de objetos abhi, Alex S, Andrii Muzychuk, battery.cord, Ben, ca_peterson,
9
de Salesforce Doug B, Eric Dobbs, LDP, Ratan Paul
(SOQL)
Manipulación de
10 kurunve, LDP, RamenChef
fecha y hora
Navegación de la
página con la ayuda
11 de la clase envoltura NITHESH K
de lista en la fuerza
de ventas.
Procesos de
12 aprobación de Ajay Gupta
objetos
https://riptutorial.com/es/home 46
SalesForce
13 Sanjay Kharwar
Integración CI
Trabajando con
14 abhi, mnoronha
Sistemas Externos
Variables globales
15 Andrii Muzychuk
en las clases
Variables globales
16 en las páginas de Ben
Visualforce
https://riptutorial.com/es/home 47