Categories
Developers Salesforce

Uso de prueba de flujo versus clase de prueba para flujo en Salesforce

Introducción de la prueba de flujo

Anteriormente, si queríamos probar el flujo, necesitábamos escribir una clase de prueba de Apex para el flujo. Con la versión Summer '22, Salesforce introdujo un marco de prueba para flujos activados por registros para automatizar las pruebas de flujos. Ahora podemos dejar que Salesforce pruebe el flujo, asegurarnos de que los resultados cumplan con las expectativas y resaltar cuando no lo sean. Ahora podemos crear y ejecutar pruebas dentro del propio generador de flujo, de forma declarativa sin escribir ningún código.

Cómo funciona

Establecer detalles de prueba, desencadenante y ruta

Proporciona una etiqueta de prueba de flujo y una descripción de la prueba. Establezca el activador de prueba en Creado/actualizado según el escenario. La ruta de la prueba está configurada para Ejecutar inmediatamente.

imagen.png Establecer registro de activación inicial/actualizado

Usando la función de búsqueda, podemos buscar el registro para usarlo como plantilla inicial. Tras la selección del registro, los campos se completan a partir del registro seleccionado. La prueba hereda los valores de campo del registro seleccionado. Sin embargo, podemos modificar los valores de estos campos antes de finalizar la prueba. La prueba no está vinculada a este registro pero contiene y utiliza sus valores de campo.

imagen.png Establecer afirmaciones

La aserción es una forma de comparar el resultado real con el resultado previsto. Si coinciden, entonces la afirmación se evalúa como verdadera. De lo contrario, la afirmación falla. Escriba las siguientes afirmaciones para garantizar que se cumplan los criterios de entrada de registros para el flujo y se logre el resultado esperado.

imagen.png Ejecutar prueba y ver detalles

Haga clic en el botón "Ver pruebas", seleccione el menú desplegable de la prueba de flujo que queremos ejecutar y seleccione Ejecutar prueba y ver detalles.

imagen.png La prueba de flujo se ejecuta y resalta el camino que tomó la prueba. Si necesitamos probar el flujo, simplemente podemos ejecutar la prueba. Ya no es necesario configurar los datos de prueba mediante programación. ¡Esto aumenta la eficiencia de las pruebas! Si necesitamos realizar una mejora en este flujo en el futuro, necesitaremos actualizar el registro de prueba asociado en consecuencia.

imagen.png Beneficios

  1. Fácil y cómodo de usar: podemos crear registros de prueba a través de la interfaz de usuario y ponerlos a prueba.
  2. Tiempo y esfuerzo: reduce el tiempo y el esfuerzo necesarios, ya que no necesitamos escribir código, solo crear registros desde la interfaz de usuario y realizar afirmaciones.
  3. No afectará la cobertura del código existente a nivel de clase: si migramos cualquier funcionalidad del activador al flujo, la lógica subyacente del activador/clase también se limpia manualmente como parte de este ejercicio. Esto no reducirá la cobertura del código de la clase ya que la lógica se elimina por completo.
  4. Cobertura de la prueba de flujo: el porcentaje de cobertura no se captura en la prueba de flujo como podemos hacerlo a través de la clase Apex. Más bien es capaz de cubrir nodos. Una vez seleccionamos “Ejecutar prueba y ver detalles”. La ruta resaltada en amarillo representará la cobertura real del flujo desde el principio hasta el final del nodo.

imagen.png

imagen.png

imagen.png Desventaja

  1. Solo puede crear pruebas de flujo para crear, actualizar o crear/actualizar flujos activados por registros. Aún no se admite la eliminación de flujos activados por registros. – Solo para el escenario de eliminación de registros podemos escribir una clase de prueba
  2. Puede afectar la cobertura general: dado que la cobertura de prueba general se calcula en función de la cobertura de prueba de todas las clases combinadas (promedio), si migramos cualquier característica que tenga una cobertura de prueba más alta en la clase ápice relevante, podría reducir el porcentaje de cobertura general del código. (Como actualmente solo nos estamos enfocando en migrar el activador relacionado con la cuenta para fluir, solo se ve afectada 1 clase de prueba, por lo que no hay cambios significativos en la cobertura del código Apex).
  3. Las pruebas de flujo no admiten rutas de flujo que se ejecuten de forma asincrónica. Sin embargo, no tenemos flujo asíncrono en nuestra organización. Estamos creando flujos para cubrir escenarios que se ejecutan sincrónicamente.

Recomendación

  • Podemos comenzar a dar pasos para pasar a la prueba de flujo a medida que Salesforce realiza mejoras continuas en el flujo, por lo que en versiones futuras, podemos esperar que la prueba de flujo incluya más mejoras y reduzca las limitaciones.
  • Podemos comenzar escribiendo una prueba de flujo para las actualizaciones rápidas de campos (antes) de los flujos de activación de registros.
  • Mejorar la cobertura de prueba de las clases que tienen menos cobertura para que podamos usar la prueba de flujo.

Preguntas más frecuentes

¿Cuál es el porcentaje de cobertura para implementar Flow?

En relación con las pruebas de Apex, las pruebas de flujo no se consideran parte de la cobertura de pruebas como en el 75%+ para el despliegue de productos.

¿Brindan cobertura de código como lo hace la clase de prueba? Si no, ¿debemos pensar en eliminar el flujo de la cobertura de prueba?

Sí, cubren resaltando nodo por nodo.

¿Puede confirmar si la prueba de flujo permite ejecutar pruebas masivas?

No, no admite pruebas de registros masivos. En la mayoría de los escenarios relacionados con desencadenantes, hemos creado un registro individual en la clase de prueba y verificamos los escenarios de prueba. Si reemplazamos esos desencadenantes con flujos, no habrá una gran diferencia en los casos de prueba.

¿La prueba de flujo admite la asincronía?

Las pruebas de flujo no admiten rutas de flujo que se ejecuten de forma asincrónica. Sin embargo, no tenemos flujo asíncrono en nuestra organización. Estamos creando flujos para cubrir escenarios que se ejecutan sincrónicamente.

¿Cuál es el rendimiento de las pruebas de flujo en comparación con las clases de prueba?

No veo ninguna documentación oficial, pero creo que la prueba de flujo será más rápida en comparación con la clase de prueba porque cuando ejecutamos una prueba creará una instancia de la clase y llamará a métodos individuales. Podemos ejecutar casos de prueba individuales utilizando una prueba de flujo, pero no es posible ejecutar un solo método individual desde la clase de prueba, lo que lleva mucho tiempo.

Referencia

Prueba de flujo (beta)

Consideraciones para probar el flujo

50% Me gusta VS
50% No me gusta

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/use-of-flow-test-vs-test-class-for-flow-in-salesforce/#utm_source=rss&utm_medium=rss&utm_campaign=use-of-flow-test-vs-test-class-for-flow-in-salesforce

Categories
Developers Tutoriales de Salesforce

Presentamos apex-mockery, una biblioteca de simulación de pruebas unitarias ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Presentamos apex-mockery, una biblioteca de simulación de pruebas unitarias | Blog de desarrolladores de Salesforce

Escribir pruebas sólidas es crucial para crear aplicaciones comerciales confiables y eficientes. En esta publicación, haremos un repaso de las pruebas unitarias y presentaremos apex-mockery , una biblioteca liviana de pruebas unitarias de Apex que lo ayuda a escribir pruebas unitarias de Apex verdaderamente desacopladas usando simulacros y aserciones. Compartiremos ejemplos de código para ayudarlo a comprender cómo puede usar la biblioteca para crear pruebas unitarias fáciles de entender y de ejecución rápida.

Un repaso a las pruebas unitarias

Antes de echar un vistazo a la biblioteca de Apex-Mockery, demos un paso atrás y analicemos algunos de los conceptos básicos de las pruebas unitarias desde un punto de vista independiente de la tecnología. Luego, veremos Apex y discutiremos por qué la mayoría de nosotros debería escribir pruebas unitarias en lugar de pruebas de integración.

Las pruebas unitarias están en la base de la pirámide de prueba.

La ingeniería de software abarca múltiples tipos de pruebas: unidad, integración, servicio, interfaz de usuario funcional, de extremo a extremo, aceptación del usuario y más. Como dice Martin Fowler , podemos representar un buen equilibrio entre estos tipos de pruebas dentro del alcance de un proyecto representándolos como una pirámide.

Las etiquetas (tipos de prueba) pueden cambiar, pero el principio clave aquí es que las pruebas que se ejecutan rápido y con frecuencia deben estar en la parte inferior de la pirámide. Estos son los más fáciles de implementar y mantener (por lo que cuestan menos). Luego, a medida que subimos a la cima, aumentamos la complejidad y el costo: las pruebas se ejecutan más lentamente y se vuelven más difíciles de implementar y mantener.

En el contexto de esta publicación y en aras de la brevedad, nos centraremos únicamente en las pruebas unitarias. Estos son los primeros que debe implementar en cualquier proyecto, y deben ser una prioridad en su estrategia de prueba.

Por definición, las pruebas unitarias están destinadas a probar la menor cantidad de código (una unidad) de un proyecto. Las pruebas unitarias solo deben basarse en la lógica pura y estar completamente desvinculadas de sus dependencias (otras clases) y límites (otros servicios, como almacenamiento de datos o servicios web). Las pruebas unitarias deben ejecutarse rápido; no requieren una configuración de prueba particular, como la inserción de datos en la base de datos, y requieren que simule las dependencias de la clase bajo prueba.

Escribir pruebas unitarias de Apex en lugar de pruebas de integración

Apex se beneficia de una estrecha integración con la Plataforma de Salesforce y, si bien esta característica es excelente para cosas como acceder rápida y fácilmente a la base de datos, difumina las líneas de separación de preocupaciones entre la lógica y los servicios. Como consecuencia, es muy fácil escribir pruebas de integración de Apex en lugar de pruebas unitarias. Por ejemplo, el código de Apex a menudo se prueba junto con la base de datos utilizando declaraciones @TestSetup y DML. Si bien estas pruebas de integración ayudan a lograr la cobertura, se basan en la base de datos y, por lo tanto, requieren más tiempo para ejecutarse que las pruebas unitarias "puras".

Como compartió Mitch Spano en su presentación de pruebas unitarias puras de Apex , la mayoría de las veces, no es necesario confiar en las pruebas de integración para probar capas de software de alto nivel, como controladores LWC, servicios y capas de aplicación. Gracias a la API de Stub de Apex lanzada en Spring '17, los desarrolladores pueden romper con esas dependencias en el contexto de las pruebas mediante la creación de su propia biblioteca/marco de pruebas unitarias o el uso de uno existente como apex-mockery.

Presentamos la burla del ápice

Como parte del trabajo de ingeniería de Salesforce, estábamos desarrollando un paquete administrado internamente y necesitábamos una biblioteca para escribir pruebas unitarias. Queríamos escribir pasos simples de "arreglar" (como en el patrón Arrange-Act-Assert ), escribir afirmaciones comprensibles y burlarnos de nuestras dependencias. Buscamos en todo el ecosistema una biblioteca fácil de leer y bien probada que pudiéramos usar para crear nuestro producto, pero no encontramos una combinación perfecta, por lo que decidimos escribir la nuestra. Estábamos tan contentos con la implementación final de la biblioteca que decidimos lanzarla como código abierto con el nombre apex-mockery .

La biblioteca apex-mockery proporciona una biblioteca de simulación simple, liviana y fácil de leer para Apex creada con la API Stub. La biblioteca está diseñada para que sea fácil de usar y brinde la mejor experiencia de desarrollador posible al generar simulacros y apéndices, configurar espías y escribir aserciones.

Lo guiaremos a través de un escenario de muestra para que pueda comprender el poder de la biblioteca con algunos ejemplos prácticos. Luego, le mostraremos cómo puede escribir pruebas para este proyecto de muestra en tres pasos:

  1. Crear simulacros y espías de métodos.
  2. Métodos de espionaje de trozo
  3. escribir afirmaciones

Ejemplo de escenario: pedidos de panadería y entrega

Considere el siguiente escenario de ejemplo: una panadería toma pedidos de pastelería y planifica las entregas utilizando un servicio dedicado. Los únicos datos que estamos considerando en el contexto de este escenario son los nombres de los pasteles y su fecha de entrega.

A continuación se muestra la implementación básica de nuestro escenario de panadería (el código completo está disponible en el repositorio del proyecto ).

Pastelería.cls

DeliveryService.cls

DeliveryServiceImpl.cls

Confirmación de pedido.cls

Panadería.cls

Ahora que hemos echado un vistazo a nuestro proyecto de muestra, echemos un vistazo a cómo podríamos escribir pruebas para el método Bakery.order .

Paso 1: crea simulacros y espías de métodos

Para funcionar, la clase Bakery necesita que se pase una instancia DeliveryService en su constructor. En un contexto de producción, el servicio se proporciona con una instancia concreta DeliveryServiceImpl de la siguiente manera:

Sin embargo, en el contexto de las pruebas unitarias, no debe usar una instancia de servicio real para garantizar el desacoplamiento. En otras palabras, DelivertServiceImpl se probará unitariamente por sí solo, por lo que no es necesario que pruebe las dos clases integradas juntas. Puede reemplazar la dependencia del servicio con un simulacro que implemente la interfaz DeliverService .

Así es como puede crear e inyectar fácilmente un simulacro de este tipo, gracias a apex-mockery:

Luego, su prueba necesita un espía, para que pueda controlar el comportamiento del método planDelivery y ejecutar aserciones en sus llamadas.

Ahora que tiene un servicio simulado y un espía en su método planDelivery , veamos cómo puede configurar su espía y ejecutar aserciones en él.

Paso 2: métodos de espionaje de trozo

Una vez que tenga una instancia simulada, puede controlar cómo se comportan sus métodos controlando sus valores de retorno y lanzando excepciones.

Utilice los métodos returns y throwsException para especificar un comportamiento predeterminado que se aplica a todas las llamadas a los métodos auxiliares. Luego, si es necesario, usa una combinación de whenCalledWith(<args>).thenReturn y whenCalledWith(<args>).thenThrow para aplicar comportamientos específicos a las llamadas a métodos que coincidan con los argumentos especificados.

Durante la ejecución de la prueba, apex-mockery comienza buscando una coincidencia en la configuración proporcionada por whenCalledWith . Si no se encuentra ninguno, vuelve a la configuración predeterminada ( returns o throwException ).

Veamos algunas situaciones comunes de configuración de stubs (ver más recetas ).

  • Devolver algo cada vez que se llame planDelivery
  • Lanza una excepción cada vez que se llama planDelivery
  • Devuelve algo cuando se llama con un argumento específico
  • Lanza una excepción cuando se llama con un argumento específico

Ahora que sabe cómo impulsar el comportamiento de su simulacro, puede agregar aserciones para probar su código.

Paso 3: Escribe afirmaciones

apex-mockery proporciona una API de afirmaciones fluidas. Tan pronto como comience su expectativa con Expect.that(mySpy) , tendrá acceso a varios métodos de afirmación. La biblioteca viene con una serie de afirmaciones de comportamiento fáciles de usar, como:

Si los comparadores de argumentos básicos no son suficientes para sus necesidades, también puede crear sus propios comparadores de argumentos personalizados .

Uniendo el ejemplo completo

Ahora que vimos los pasos individuales, terminemos y echemos un vistazo a nuestra prueba para el método Bakery.order . Observe cómo puede usar aserciones de burla de Apex, junto con las aserciones estándar de Apex de la clase system.Assert , en sus pruebas.

palabras de cierre

Esto concluye nuestro recorrido por las pruebas unitarias y la biblioteca de Apex-Mockery. Aprendió cómo las pruebas unitarias desacopladas son más fáciles de escribir y ejecutar mucho más rápido. Tener pruebas rápidas acorta el ciclo de retroalimentación del ciclo de vida del desarrollo, reduce la duración de la ejecución del flujo de trabajo de CI y acelera las implementaciones. Estos factores permiten a los desarrolladores implementar y ejecutar pruebas con frecuencia, mejorando así la calidad.

apex-mockery lo ayuda a dirigir su proyecto en esta dirección. Consulte el repositorio del proyecto para comenzar. Encontrará la documentación de la biblioteca con las opciones de instrucciones de instalación (instalación de fuente o paquete desbloqueado), algunas recetas de muestra y una guía de migración. ¡Feliz prueba unitaria!

Sobre los autores

Ludovic Meurillon es ingeniero de software en el equipo de Service Cloud en Grenoble, Francia. Empujó el código a la producción durante años, disfruta eliminando más líneas de código de las que agrega y prefiere la programación en pares sobre las revisiones de código y los productos de trabajo sobre el diseño perfecto. Sígalo en Twitter @LudoMeurillon o consulte sus proyectos de GitHub @ludomeurillon .

Sébastien Colladon es CTA e ingeniero de software en el equipo de Service Cloud en París, Francia. Le encanta contribuir a hacer del ecosistema de Salesforce un lugar mejor y disfruta aprender y trabajar con otros. Consulte sus proyectos de GitHub @ scolladon .

Philippe Ozil es un defensor principal de desarrolladores en Salesforce, donde se enfoca en la plataforma de Salesforce. Escribe contenido técnico y habla con frecuencia en conferencias. Es un desarrollador full-stack y disfruta trabajar en proyectos DevOps, robótica y VR. Sígalo en Twitter @PhilippeOzil o consulte sus proyectos de GitHub @pozil .

Obtenga las últimas publicaciones de blog de desarrolladores de Salesforce y episodios de podcast a través de Slack o RSS.

Agregar a Slack Suscríbete a RSS

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2023/06/introducing-apex-mockery-a-unit-test-mocking-library.html

Categories
Developers

Establecer fecha de creación para sObject de clase de prueba en Apex

Última actualización el 5 de junio de 2023 por Rakesh Gupta

Gran idea o pregunta duradera:

  • ¿Cómo se puede establecer la Fecha de creación para un sObject dentro de un contexto de prueba?

Objetivos:

Después de leer este blog, podrá:

  • Obtenga una comprensión integral del método setCreatedDate relacionado con las pruebas de Apex
  • Establecer la fecha de creación para el registro de la clase de prueba
  • y mucho más

👉 En el pasado escribí algunos artículos sobre Apex . ¿Por qué no echarles un vistazo mientras estás en ello?

  1. Calcular la cobertura general del código en Salesforce
  2. Comprobar si una cadena es nula, vacía o en blanco en Apex

Ben Halpern es un desarrollador Jr. de Salesforce en Gurukul On Cloud (GoC) . Creó un disparador de Apex para el objeto Lead.


desencadenar LeadTrigger en Lead (antes de la actualización) { if(Desencadenador.esAntes){ si (Desencadenador.Isupdate){ para (Lead myLead:trigger.new){ if(myLead.LeadSource==null && myLead.createddate== Fecha.hoy().addDays(-1)){ //hacer algo } } } }
}

Sabe cómo escribir la clase de prueba para el código anterior. Necesita ayuda para crear un registro con una fecha pasada dentro de la clase de prueba.

Enfoque de Campeón de Automatización (I-do):

Para establecer la fecha de creación de un sObject en una clase de prueba de Apex, puede utilizar el método Test.setCreatedDate(recordId, createdDatetime) . Esto le permite especificar una fecha y hora deseadas para el campo Fecha de creación del registro de sObject dentro de la clase de prueba.

A continuación se muestran detalles sobre los parámetros setCreatedDate .

Nombre de los parámetros
Detalles
ID de registro Representa el ID de un sObject.
Fecha y hora de creación Representa el valor para asignar al campo Fecha de creación del sObject.

Además, es importante tener en cuenta que el método setCreatedDate no se puede utilizar dentro de los métodos anotados con @isTest(SeeAllData=true). Hagamos una pausa aquí, familiarícese con el método de prueba s etCreatedDate Apex.

Práctica guiada (nosotros hacemos):

Con estos métodos, puede determinar de forma eficaz si un campo de texto es nulo, está vacío o está en blanco en Apex. Veamos esto en acción:

  1. Haga clic en Configuración | Consola de desarrollador .  
  2. Para crear una clase de prueba de Apex, haga clic en Archivo | Nuevo | Clase ápice.
     @esPrueba clase privada LeadTrigger_Test { static testMethod void testSetCreatedDate() { Lead l = new Lead(LastName='myLastname', Company='myCompany'); insertar l; Test.setCreatedDate(l.Id, Date.today().addDays(-1)); Prueba.startTest(); Lead myLead = [SELECCIONE Id, Nombre, Apellido, Empresa, Fecha de creación FROM Lead WHERE Apellido ='miApellido' límite 1]; myLead.FirstName = 'myFirstname'; actualizar myLead;
    System.assertEquals(myLead.CreatedDate, Date.today().addDays(-1)); Prueba.detenerPrueba(); }
    }

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2023/06/05/set-created-date-for-test-class-sobject-in-apex-2/

Categories
Developers Tutoriales de Salesforce

Sube de nivel tus habilidades Apex ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Subiendo de nivel tus habilidades de Apex | Blog de desarrolladores de Salesforce

Apex es una habilidad única que los desarrolladores deben dominar al crear soluciones personalizadas con Salesforce. Hay algunos conceptos básicos que son esenciales. Ciertas cosas, como la sintaxis y el flujo de control, son como aprender cualquier otro idioma. Otras cosas, como operaciones masivas, límites reguladores y disparadores, son particulares de Apex y cómo se implementa en la Plataforma de Salesforce. Una vez que tenga una idea de estas características y modismos clave, ¿a dónde va después?

En esta publicación, aprenderá sobre algunas características de Apex que son críticas para cualquier desarrollador de Apex que busque mejorar más allá de lo básico, junto con dónde puede ir para aprender sobre ellas.

Nota: Siempre que sea posible, los ejemplos de código en esta publicación se toman directamente o se adaptan de la aplicación de muestra Recetas de Apex o la Guía para desarrolladores de Apex. Ver las referencias al final del artículo.

En estos días, si desea un proceso automatizado o una interfaz de usuario similar a un asistente, Flow siempre debe ser una opción que considere. El alcance, la flexibilidad y la madurez de Flow han crecido enormemente. Aún así, es raro que los problemas comerciales complejos se puedan resolver sin ningún tipo de código.

Introduzca Apex invocable.

La anotación @InvocableMethod se usa para definir métodos llamados por Flow. Y @InvocableVariable muestra los parámetros para que Flow pase datos a su código Apex. ¿Por qué llamaría a Apex desde Flow? Quizás la lógica de su flujo se está volviendo demasiado compleja. Tal vez su automatización necesite realizar una operación que no sea accesible para Flow. En casos como estos, Apex puede ser su amigo.

Aquí hay una ilustración básica del uso de la anotación @InvocableMethod :

<dx-code-block title language="java" code-block="public class AccountQueryAction {   @InvocableMethod(label='Get Account Names' description='Returns the list of account names corresponding to the specified account IDs.' category='Account')   public static List getAccountNames(List ids) {     List accountNames = new List();     List accounts = [SELECT Name FROM Account WHERE Id in :ids];     for (Account account : accounts) {       accountNames.add(account.Name);     }     return accountNames;   } }»>

Este ejemplo de la Guía para desarrolladores de Apex ilustra cómo la anotación marca esto como un método que Flow puede invocar. Tenga en cuenta que la anotación también define detalles como una etiqueta y una descripción que determinan lo que se muestra al usuario de Flow Builder.

Un efecto secundario importante de las anotaciones de @Invocable… del que pocas personas hablan es que esto muestra automáticamente su Apex al punto final de la API <INSTANCEURL>/data/<VERSION>/actions/custom/apex .

Otra cosa útil que puede hacer al invocar Apex desde su flujo es acceder a los diferentes tipos de Apex asíncrono. Lo que trae a colación la siguiente característica de Apex que se debe abordar.

La ejecución asíncrona desacopla una acción que queremos realizar del contexto de ejecución actual. Siguiendo las mejores prácticas actuales, existen tres formas de ejecutar Apex de forma asincrónica: en cola, programable y por lotes. Aunque técnicamente el bus de eventos es asíncrono, lo omitiremos por el momento.

Si solo necesita activar un poco de código para ejecutarlo de forma asincrónica, la opción en cola es la herramienta de referencia. Si tiene varias tareas asincrónicas, queueable las ejecuta de manera determinista en orden. Debido a que están en cola en orden, también puede encadenar una llamada asíncrona de otra. Y Apex en cola admite entradas de objetos o tipos primitivos.

Apex programado funciona tal como lo esperaría: ejecute algún código de Apex en un horario. Batch Apex está optimizado para trabajar con conjuntos de datos muy grandes. Para utilizar Apex asíncrono, debe crear una clase de Apex que implemente una interfaz específica: Queueable , Schedulable o Batchable , respectivamente.

Nota: algunos desarrolladores pueden estar familiarizados con la anotación @Future para hacer que un solo método sea asincrónico, también conocido como "métodos futuros". Los métodos futuros, aunque rápidos y fáciles, tienen limitaciones que los hacen menos útiles. No hay nada que pueda hacer con un método futuro que no se pueda hacer mejor con una clase en cola. Por este motivo, no recomendamos implementaciones de producción con métodos futuros.

Por lo tanto, echemos un vistazo a un ejemplo de una clase de Apex que se puede poner en cola.

<dx-code-block title language="Java" code-block="public with sharing class QueueableRecipes implements Queueable { public static void execute(QueueableContext qc) { List accounts = [ SELECT Id, Description FROM Account LIMIT 1000 ]; for (Account acct : accounts) { acct.Description += ‘ Edited by Queueable class’; } try { update accounts; } catch (DmlException dmle) { System.debug( LoggingLevel.INFO, ‘real life use cases should do more than just logging the error: ‘ + dmle.getMessage() ); } }
} «>

Todas las interfaces asíncronas de Apex tienen un método execute() que debe implementarse como se muestra arriba. Para ejecutar su clase Queueable , debe ponerla en cola.

Si bien no se muestra en este ejemplo de la aplicación de muestra Recetas de Apex, para pasar datos a su cola, anule el constructor con los parámetros que necesita.

El término "Apex dinámico" es un poco inapropiado. O, al menos, podría malinterpretarse como que Apex de alguna manera funciona como un lenguaje de programación dinámico. Esto no es a lo que se refiere (por ejemplo, no hay Apex
función eval !).

Dynamic Apex es un código que se adapta a diferentes tipos de SObject ( Account , Contact , My_Custom_Object__c , etc.) en tiempo de ejecución. Esto se hace abstrayendo referencias específicas de SObject. La clave es usar la superclase SObject cuando se trabaja con datos. También utilizará las funciones de "descripción" de Apex para detectar con qué objetos y campos está trabajando y qué puede hacer con ellos (por ejemplo, si este usuario puede consultar este objeto).

Esta es una habilidad esencial para los desarrolladores de ISV. A menudo, creará una aplicación que debe adaptarse al entorno local del cliente que instala su aplicación. Esto significa que su código necesita detectar, describir y adaptar su comportamiento dependiendo de datos conocidos o incluso desconocidos.

Aunque es esencial para un desarrollador de ISV, también es importante para cualquier persona que quiera escribir código más reutilizable.

Tome este ejemplo de consulta muy básico:

<dx-code-block title language="Java" code-block="List accts = [SELECT Id, Name, Website FROM Account];»>

Esto funcionará todo el día consultando los datos de la cuenta. Pero, ¿y si queremos construir una consulta para cualquier SObject?

Para convertir esto en un Apex "dinámico", necesitamos abstraer las referencias de campo y SObject específicas. Y tal vez lo incluiríamos en un método que permitiera a otro desarrollador pasarlos. También podríamos verificar para asegurarnos de que el usuario tenga los permisos de objeto para realizar la operación que estamos a punto de intentar.

<dx-code-block title language="Java" code-block="public static List executeDynamicQuery(Schema.DescribeSObjectResult obj, List fields){ // Create a result-set list List resultRecords; if (obj.isQueryable()){ // Set up a query string String queryTemplate = ‘SELECT {0} FROM {1}’; List queryDetails = new List{String.join(fields, ‘, ‘), obj.getName()}; String queryString = String.format(queryTemplate, queryDetails); // Run your query resultRecords = Database.query(queryString); } return resultRecords; } «>

Lo anterior construye una consulta para un SObject que se pasa al método y una lista arbitraria de campos. Utiliza el objeto DescribeSObjectResult para detectar la capacidad de consulta e inferir el nombre de la API de SObject al construir y ejecutar la consulta. A continuación, debe invocarlo.

Así es como podríamos hacer eso con los objetos Cuenta y Contacto, respectivamente:

<dx-code-block title language="Java" code-block="List accountRecords = DynamicApexClass.dynamicQuery(Account.SObjectType.getDescribe(), new List{‘Id’,’Name’,’Website’}); List contactRecords = DynamicApexClass.dynamicQuery(Contact.SObjectType.getDescribe(), new List{‘Id’,’FirstName’,’LastName’}); «>

Este ejemplo no aborda algunos riesgos de SOQL dinámico, como la inyección de SOQL. Por lo tanto, asegúrese de leer sobre Apex dinámico. Aprender a escribir Apex seguro hará que sea menos probable que implemente código vulnerable en su organización (o la de un cliente). El enlace de variables en sus consultas SOQL es una herramienta clave para proteger su Apex dinámico de ser explotado. El método escapeSingleQuotes() es otra herramienta más antigua que también puede encontrar. El modo de usuario también es clave para garantizar que cualquier acción realizada tenga que cumplir con todas y cada una de las restricciones del usuario que la ejecuta.

Para obtener un ejemplo más completo y seguro de Apex dinámico, consulte la receta de Apex del método invocable en la aplicación de ejemplo Recetas de Apex. Esa acción invocable funciona con el objeto Cuenta o Tarea.

Con Salesforce, hay algunas formas de realizar la integración sin código. Específicamente, si solo necesita una aplicación o servicio de cliente para obtener datos de Salesforce, hay muchas API que se muestran automáticamente sin ningún tipo de codificación en el lado de Salesforce. Incluso se ajustan a su esquema personalizado. Si está integrando su organización a un sistema externo compatible con OData, puede usar Salesforce Connect y objetos externos (nuevamente, no se requiere código).

Pero a veces, es posible que deba llamar desde su organización a un servicio externo. O tal vez desee mostrar un punto final personalizado que agrupe más complejidad que una de las API estándar. Nuevamente, Apex contiene funciones que admiten tanto la aparición de nuevas API personalizadas como la llamada a servicios web.

Al pensar en API personalizadas, en estos días, la mayoría de los desarrolladores pensarían en API REST. Puede crear una API REST personalizada en Salesforce Platform creando una clase de Apex que se anota con la anotación @RestResource . Parte del trabajo de la anotación es definir también el nombre del recurso. Todas las API REST personalizadas basadas en Apex se encuentran en <INSTANCEURL>/services/apexrest/ .

Para definir los comportamientos que necesita admitir, hay una serie de anotaciones de métodos que corresponden a verbos HTTP, como @HttpGet y @HttpPost . La clase RestContext contiene un conjunto de elementos de acceso para obtener el estado de la solicitud HTTP entrante y la respuesta saliente que devuelve. A continuación, se muestra un ejemplo de un extremo REST básico que aparece en el método HTTP GET. Tenga en cuenta cómo se utilizan las anotaciones.

<dx-code-block title language="Java" code-block="@RestResource(urlmapping='/integration-service/*')
global inherited sharing class CustomRestEndpointRecipes( … @HttpGet global static String getRecordsToReturn() { RestResponse response = RestContext.response; try { List accounts = [ SELECT Id, Name, Phone, Website FROM Account WITH USER_MODE ]; response.statusCode = 200; String serializedAccounts = JSON.serialize(accounts); return serializedAccounts; } catch (QueryException qe) { System.debug( LoggingLevel.INFO, ‘Failed to query a list of Accounts. Error is: ‘ + qe.getMessage() ); response.statusCode = 400; return qe.getMessage(); } }
} «>

Si su requisito es crear un servicio SOAP, también hay un conjunto de características para admitir ese protocolo.

Fuera del código real, necesitará una sesión autorizada para acceder a cualquier servicio web que cree. Pero si ya tiene un cliente autorizado, la solicitud es solo otra llamada al punto final personalizado que defina.

La llamada a un punto final REST externo se realiza a través de un conjunto de clases. La clase HttpRequest le permite definir los parámetros de cómo se comportará su solicitud (punto final, verbo HTTP, encabezados, etc.). La solicitud se realiza a través del método estático Http.request() . Esto devuelve un objeto HttpResponse que le proporciona los datos devueltos o el error si la solicitud falla.

Nota: Las clases HttpRequest y HttpResponse son las mismas para las llamadas REST y los servicios REST personalizados.

Se requiere cierta configuración para su texto destacado. Específicamente, deberá configurar una credencial con nombre en la mayoría de los casos. Esta configuración le permite descargar el protocolo de enlace de autenticación de su código. Aunque, si está llamando a un servicio anónimo no autenticado, también puede optar por usar una configuración de sitio remoto más simple.

= 200 && response.getStatusCode()

El ejemplo anterior hace una llamada simple a un punto final. Tenga en cuenta que no se utilizan las opciones para establecer encabezados ni usar una credencial con nombre, ya que esta solicitud es para una API simple que no requiere autenticación.

La transmisión de eventos es una herramienta valiosa para crear arquitecturas débilmente acopladas en aplicaciones complejas. La plataforma de Salesforce implementa la transmisión de eventos a través de dos características principales: eventos de plataforma y captura de datos modificados. La columna vertebral de estas funciones es el bus de eventos.

De la Guía para desarrolladores de eventos de plataforma, el bus de eventos es "Un servicio de entrega y almacenamiento de eventos de múltiples inquilinos y múltiples nubes basado en un modelo de publicación-suscripción". Tanto su organización como los sistemas externos pueden publicar y suscribirse a eventos. Por supuesto, es clave que si publicas un mensaje, algo debe haberse suscrito para que suceda cualquier otra cosa.

Los eventos de plataforma representan los datos que pasan a través del bus de eventos. Los eventos se procesan en el orden en que se reciben. Una forma de pensar en ellos es como un SObject efímero que se almacena temporalmente en el bus de eventos en su camino hacia su destino. De hecho, los metadatos de un evento se almacenan en el mismo lugar de su proyecto que sus SObjects. Puede distinguir los eventos de plataforma personalizados de los SObjects por su sufijo __e (por ejemplo Order_Complete__e ).

Una vez que completa un evento con sus datos, el método EventBus.publish() es similar a una llamada DML en su SObject normal. Tenga en cuenta el código a continuación que publica un evento.

En Apex, se suscribe a un evento creando un disparador asíncrono para él. Pero los disparadores asíncronos son diferentes de la operación DML transaccional estándar de un disparador normal. Por esta razón, debe tener en cuenta algunas diferencias. Con disparadores asíncronos, el tamaño del lote es diferente. Necesitas configurar tu usuario de ejecución. Las operaciones de activación de eventos también se pueden volver a intentar. Asegúrese de conocer estas diferencias a medida que comience a implementar activadores de eventos de plataforma. Tenga en cuenta el disparador a continuación.

A diferencia de los disparadores DML típicos, los disparadores de eventos de plataforma solo admiten el contexto after insert . Tampoco existe una acción explícita para suscribir un disparador a un evento de plataforma. Una vez que el activador se implementa en su organización, se suscribe automáticamente.

Además de Apex, los eventos de la plataforma pueden activarse y suscribirse mediante sistemas externos y Flow. Son clave en las integraciones débilmente acopladas. Como tal, es raro que Apex active y se suscriba al mismo evento.

Hemos cubierto mucho. Pero de ninguna manera esto es todo lo que necesita saber como desarrollador de Apex. Los elementos cubiertos se basan en algunas características bastante comunes. Pero es posible que deba aprender otras funciones de Apex según los requisitos de su proyecto. Aquí hay algunos otros elementos que debe tener en cuenta.

Caché de plataforma : si proviene de otras plataformas de programación, estará familiarizado con la noción de una variable estática o global persistente en todas las transacciones. Pero en Apex, las estáticas se limitan a la transacción. La memoria caché de la plataforma es una característica de Apex que permite la persistencia de datos en memoria entre transacciones. Si encuentra un retraso en el rendimiento relacionado con la recuperación de datos, la memoria caché de la plataforma puede ayudar.

Marcos de activación : no es una característica del lenguaje, sino bibliotecas que facilitan el uso de activadores. Estos proyectos creados por la comunidad abstraen el código de activación repetitivo que a menudo necesita escribir. Al usar un marco de activación, debería permitirle concentrarse solo en la lógica que debe abordarse. Para algo más que un disparador trivial, se recomienda encarecidamente adoptar un marco. Y conozco a algunos que argumentarían que debería considerar un marco incluso para ese disparador trivial. Pero este no es el lugar para debatir el tiempo de valor frente a la optimización prematura. Hay una implementación muy simple de esto en la aplicación Apex Recipes .

SOSL : el lenguaje de búsqueda de objetos de Salesforce ( SOSL ) es el primo subestimado de SOQL. SOSL permite consultas basadas en texto no deterministas. Es muy eficiente para encontrar datos de texto en comparación con la búsqueda de campos de texto con SOQL y comodines. Admite la búsqueda de varios SObjects simultáneamente y contiene funciones para filtrar de forma determinista los resultados de la búsqueda. Si tiene consultas SOQL de texto que son lentas, definitivamente consulte esta herramienta.

AuraEnabled : para mostrar el código Apex personalizado en sus componentes web Lightning (LWC), esta anotación es clave. Es muy probable que ya esté usando este si comenzó su viaje de Salesforce creando LWC. Pero si aún no lo ha usado, búsquelo en cualquier proyecto que involucre una interfaz de usuario personalizada. ¿Por qué "Aura" habilitado si es para LWC? Bueno, esta anotación se creó inicialmente para admitir el predecesor de LWC, el marco Aura. Tenía sentido no reinventar una nueva anotación cuando la existente funcionaría igual de bien para LWC.

Cada viaje para aprender un nuevo lenguaje de programación tiene algunas características clave que todos deben conocer. La sintaxis básica, el control de flujo y el modelo de ejecución de la plataforma son fundamentales para comprender. Pero una vez que tenga esos conceptos básicos, trabajar en funciones más avanzadas es clave para aumentar su conjunto de habilidades. Las acciones invocables, el Apex asíncrono, el Apex "dinámico", la integración y el bus de eventos son funciones que probablemente utilizará a medida que avanza. Al familiarizarse con estos ahora, no solo se preparará para abordar proyectos en el futuro, sino que también podrá tomar mejores decisiones de solución.

Si cree que está listo para aprender, los senderos para desarrolladores intermedios y avanzados en Trailhead pueden ayudarlo a encaminarse con todos estos temas y más.

Aplicación de muestra Apex Recipes en Github

Guía para desarrolladores de Apex

Guía de referencia de idiomas de Apex

Centro de desarrolladores de Apex

Peter Chittum ha trabajado en software empresarial y habilitación para desarrolladores durante más de 20 años. Pasó los últimos 12 años ayudando a miles de desarrolladores a tener éxito en la plataforma de Salesforce, y más recientemente lideró el equipo de promotores de desarrolladores en Salesforce. Pasa su tiempo libre con su familia, anda en bicicleta de montaña, cocina y toca música. Sígalo en Twitter (@pchittum), LinkedIn (en/PeterChittum) o BlueSky Social (@pchittum.bsky.social).

Obtenga las últimas publicaciones de blog de desarrolladores de Salesforce y episodios de podcast a través de Slack o RSS.

Agregar a Slack Suscríbete a RSS

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2023/05/leveling-up-your-apex-skills.html

Categories
Developers

Generar código de barras y código QR en Salesforce

Última actualización el 12 de mayo de 2023 por Rakesh Gupta

Gran idea o pregunta duradera:

  • ¿Cómo generar código de barras y código QR en Salesforce?

Objetivos:

Después de leer este blog, podrá:

  • Comprender la diferencia entre código de barras y código QR
  • Beneficios de usar Código de Barras y Código QR
  • Genere un código de barras y muéstrelo en un campo
  • Cargar el código de barras en el archivo de Salesforce y asociarlo con el producto
  • y mucho más

Jestilla Zetkin trabaja como arquitecta de Salesforce en Gurukul On Cloud (GoC) . Mientras trabajaba en la implementación de Sales Cloud, obtuvo el requisito de generar códigos de barras. A continuación se detalla el requisito:

  1. Generar un código de barras para el código del producto
  2. Mostrar el código de barras en la página de detalles del producto
  3. Adjunte automáticamente el código de barras a la lista relacionada con el archivo en el producto.

¿Qué son el código de barras y el código QR?

Un código de barras y un código QR son tipos de códigos legibles por máquina que se utilizan para almacenar y recuperar información.

Un código de barras es una imagen cuadrada o rectangular compuesta de líneas paralelas negras y espacios en blanco. Se utiliza en tiendas para rastrear el inventario de productos, en hospitales para rastrear registros de pacientes y en el rastreo de equipaje de aerolíneas, etc.

Un código de respuesta rápida, también conocido como código QR, es un tipo de código de barras que incluye detalles legibles por máquina sobre el elemento al que está adjunto. Se utiliza para compartir datos como videos, fotos, URL web, contactos, etc.

La distinción principal entre un código de barras y un código QR es que un código de barras solo puede almacenar datos en una dimensión, mientras que un código QR puede almacenar datos en dos dimensiones.

¿Beneficios de usar código de barras y código QR?

El código de barras y el código QR brindan varias ventajas en el proceso de ventas, incluida una precisión mejorada, disponibilidad de fecha inmediata, implicaciones de bajo costo y mejor control de inventario. Beneficios de usar códigos de barras y códigos QR:

  1. Entrada de datos eficiente : los códigos de barras y los códigos QR eliminan la necesidad de la entrada manual de datos, lo que reduce los errores y aumenta la eficiencia.
  2. Gestión de inventario : ayudan a agilizar el seguimiento y la gestión del inventario al proporcionar información precisa y en tiempo real.
  3. Transacciones más rápidas : escanear códigos de barras y códigos QR acelera las transacciones en el punto de venta, lo que reduce los tiempos de espera.
  4. Fácil implementación : los códigos de barras y los códigos QR se pueden generar e imprimir fácilmente, y su escaneo se puede realizar con teléfonos inteligentes estándar o escáneres dedicados.
  5. Oportunidades de marketing mejoradas : los códigos QR, en particular, se pueden usar para atraer a los clientes con contenido interactivo, promociones y anuncios.

¿Cómo generar código de barras y código QR?

Para generar un código de barras, puede utilizar varios generadores de códigos de barras en línea o bibliotecas de programación que ofrecen funcionalidades de creación de códigos de barras.

En este artículo usaremos la API de código de barras bwip-js . La API en línea de bwip-js está alojada en una instancia Amazon AWS EC2 mediante una aplicación node.js. Puede usar esta API para generar dinámicamente imágenes de códigos de barras desde cualquier lugar de la web. La imagen devuelta está en formato PNG. No hay cargos por usar esta API y no pude encontrar ningún límite de uso.

Los dos parámetros requeridos son el tipo de código de barras y el valor a codificar. También puede agregar parámetros adicionales para rotar (permite rotar la imagen a una de las cuatro orientaciones ortogonales) e incluir texto .

Práctica guiada (nosotros hacemos):

Realice los pasos a continuación para generar un código de barras para el código del producto:

Paso 1: cree un campo de fórmula personalizada en el producto para generar y mostrar un código de barras

Ahora generaremos la imagen del código de barras usando un generador de código de barras bwip-js y mostraremos la imagen en un campo de fórmula usando la etiqueta de imagen.

  1. Haga clic en Configuración .
  2. En el Administrador de objetos, escriba Producto .
  3. Seleccione Campos y relaciones , luego haga clic en Nuevo .
  4. Seleccione Fórmula como Tipo de datos, luego haga clic en Siguiente.
  5. Ingrese la etiqueta del campo : código de barras (código del producto) y haga clic en la tecla de tabulación, se completará el nombre del campo .
    1. Tipo de devolución de fórmula : Texto
  6. Haga clic en el botón Siguiente .
    1. URL de la fórmula : IMAGEN(“ https://bwipjs-api.metafloor.com/?bcid=code39&text=”+ ProductCode +”&scale=2&rotate=N&includetext&backgroundcolor=ffffff”,”Barcode”)
  7. Establezca la seguridad a nivel de campo para los perfiles .
  8. Agregue este campo a Diseño de página .
  9. Haga clic en Guardar .

Paso 2: asociar la imagen del código de barras al archivo de Salesforce

Ahora ya sabe cómo generar la imagen del código de barras sin ningún código. El siguiente paso es cargar la imagen del código de barras en el archivo de Salesforce para generar o imprimir un PDF.

  1. La imagen devuelta de la API de código de barras bwip-js está en formato PNG. Necesitamos un código apex para recuperar el cuerpo de esta solicitud como un blob.
     Solicitud HttpRequest = new HttpRequest();
    solicitud.setEndpoint(r.imagenURL);
    solicitud.setMethod('GET');
    Enlace Http = nuevo Http();
    Respuesta HttpResponse = vinculante. enviar (solicitud);
    Imagen de blob = respuesta.getBodyAsBlob();

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2023/05/11/generate-barcode-and-qr-code-in-salesforce-2/

Categories
Developers Discover Magazine Tutoriales de Salesforce

Aprenda MOAR en Winter '23 con acciones externas de Pardot ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Aprenda MOAR en Winter '23 con acciones externas de Pardot | Blog de desarrolladores de Salesforce

Siga y complete un trailmix de Learn MOAR Winter '23 para administradores o desarrolladores antes del 30 de noviembre de 2022 a las 11:59 p. Se aplican restricciones. Aprenda cómo participar y revise las reglas oficiales visitando la página de Trailhead Quests .

Introducción de acciones externas

Con las acciones externas disponibles en Winter '23, Salesforce permite a las empresas aprovechar los servicios externos y las aplicaciones de terceros fuera de Salesforce desde sus programas de Engagement Studio. Por ejemplo, es posible que desee registrar prospectos para un seminario web en su nombre o utilizar un servicio externo para enviar un mensaje SMS. Asegúrese de consultar laGuía de la API de Pardot para obtener más información.

La clave para usar Acciones externas radica en la capacidad de invocar Acciones invocables de Salesforce. Las acciones invocables le permiten agregar más funciones a su aplicación, ya sea con acciones estándar, como publicar en Chatter y enviar un correo electrónico, o acciones personalizadas mediante Apex que puede escribir usted mismo para satisfacer sus necesidades únicas. También puede empaquetar sus acciones invocables personalizadas e implementarlas en AppExchange para que otros puedan usar su función.

En esta publicación, veremos cómo crear su propia acción invocable personalizada con un servicio externo que luego puede usar con Acciones externas.

Comience con las acciones externas

Para este ejemplo, crearemos una integración con Twilio para enviar mensajes SMS desde Engagement Studio. Veamos primero los pasos que un administrador debe seguir para crear la credencial con nombre, el servicio externo, la clase Apex de acción invocable y la extensión de la aplicación de marketing. Después de eso, veremos los pasos que tomaría un vendedor para crear un nodo de acción en un programa de Engagement Studio que usa la acción externa recién creada.

Pasos para el administrador

1) Configuración de autenticación

Para comenzar, diríjase a la sección Configuración en Salesforce, donde crearemos la credencial con nombre y el servicio externo para Twilio. Necesitaremos saber el nombre de usuario y la contraseña de la API que hemos configurado en el servicio Twilio (Twilio incluso ofrece una cuenta de prueba gratuita para que podamos darle una vuelta). Cuando esté listo, cree una credencial con nombre como en la imagen a continuación (usando el nombre de usuario/contraseña mencionados).

Nota: una credencial con nombre especifica la URL de un extremo de llamada y sus parámetros de autenticación requeridos en una definición.

A continuación, cree un servicio externo (que también se encuentra en la sección Configuración) utilizando esa credencial con nombre. Al crear servicios externos, necesitaremos definir un esquema para ese servicio, que se basa en las especificaciones de OpenAPI 2.0 . La mayoría de los proveedores proporcionan documentación de Swagger para su API, que se puede convertir a la especificación de API abierta. Aquí hay un esquema de ejemplo en formato JSON:

Al crear el servicio externo y colocar el esquema JSON, las páginas de configuración deberían verse así:

Luego, navegaremos por el resto de las pantallas, asegurándonos de que la operación que definimos en el esquema esté allí con los parámetros de entrada y salida correctos.

La última página es solo un resumen del servicio que hemos creado. Una vez que presionamos Listo, nuestro nuevo servicio está listo.

2) Crear una acción invocable

Lo siguiente que debemos hacer es crear la clase de Apex que usará nuestro nuevo servicio externo y realizará llamadas a la API de Twilio. No necesariamente necesitamos crear una clase de Apex; en muchos casos, podríamos simplemente usar el servicio externo que creamos como la acción invocable y omitir esta sección. Sin embargo, es posible que tengamos una lógica comercial única, manejo de errores, registro, etc. que querríamos realizar. En ese caso, crearíamos una clase de Apex para hacer ese tipo de trabajo.

Para hacer esto, abra su consola de desarrollador, cree una nueva clase de Apex y SendTwilioSmsMessageActionMessage .

<dx-code-block title language code-block="public class SendTwilioSmsMessageActionMessage { @InvocableMethod(label='Send SMS via Twilio' description='Sends an SMS message via TwilioES') public static void sendSms(List twilioReq){ Map payload = new Map{ ‘To’ => twilioReq[0].To, ‘MessagingServiceSid’ => twilioReq[0].messageServiceSid, ‘Body’ => twilioReq[0].Body }; HttpRequest req = new HttpRequest(); req.setEndpoint(‘callout:TwilioNC/2010-04-01/Accounts/’ + twilioReq[0].accountSid + ‘/Messages.json’); req.setMethod(‘POST’); req.setHeader(‘Accept’, ‘application/json’); req.setHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’); req.setBody(urlEncode(payload)); Http http = new Http(); HTTPResponse res = http.send(req); System.debug(‘========== res.getBody():’ + res.getBody()); } public static String urlEncode(Map vals) { String result = »; for(String thisKey : vals.keySet()) { result += EncodingUtil.urlEncode(thisKey, ‘UTF-8’) + ‘=’ + EncodingUtil.urlEncode(vals.get(thisKey), ‘UTF-8’) + ‘&’; } return result.removeEnd(‘&’); } public class TwilioSmsMessageActionRequest { @InvocableVariable(required=true) public String accountSid; @InvocableVariable(required=true) public String messageServiceSid; @InvocableVariable(required=true) public String To; @InvocableVariable(required=true) public String Body; }
}»>

Hay algunas cosas notables en esta clase de Apex:

  • La anotación @InvocableMethod (ver documentos ) es necesaria para cualquier acción externa que dependa de la funcionalidad de las acciones invocables.
  • Al enviar un mensaje SMS de Twilio, hay ciertas cosas que son exclusivas de ese mensaje o del remitente, por lo que queremos que sean configurables. Es por eso que hemos usado la anotación @InvocableMethod para las accoundSid , messageServiceSid , To y Body . Estos se utilizarán como variables de entrada en nuestro programa Engagement Studio.
  • La credencial con nombre que creamos anteriormente ( TwilioNC ) se usa al crear el punto final de la siguiente manera:
    • req.setEndpoint('llamada:TwilioNC/2010-04-01/Cuentas/' + twilioReq[0].accountSid + '/Messages.json');

3) Crear la extensión y configurar la acción externa

Una vez que hayamos guardado nuestra nueva clase Twilio SMS Apex, necesitaremos crear una nueva extensión de aplicación de marketing y una acción que la use.

Por lo tanto, vaya a la página Configuración de marketing y luego a la sección Extensiones de aplicaciones de marketing. Aquí, crearemos uno nuevo y lo llamaremos "Twilio".

Luego, necesitaremos agregar la clase Apex de acción invocable que creamos anteriormente como una acción en la pestaña relacionada de la extensión. Podemos ver eso cuando buscamos el nombre de clase de Apex que creamos antes ( SendTwilioSmsMessageActionMessage ); aparece en el cuadro Acción invocable para la acción.

El esquema de acción y los parámetros de acción se completan automáticamente para nosotros mediante la acción invocable que creamos antes, por lo que solo podemos aceptar los valores predeterminados. Pero para mayor claridad, el esquema de acción es el siguiente:

Podemos ver que el esquema se trata solo de definir las propiedades de entrada necesarias para pasar a la acción invocable, así como cuáles se requieren al llamar a la acción invocable.

Para nuestra acción de ejemplo, nos hemos tomado la libertad de completar los campos accountSid , messageSid y To aquí en el esquema, para que nuestro vendedor no tenga que hacerlo. El accountSid y messageServiceSid son exclusivos de la cuenta de Twilio del remitente y deben recuperarse desde allí.

Si estuviéramos planeando empaquetar esto e implementarlo en AppExchange, no querríamos codificar de forma rígida el accountSid y el messageSid como lo hemos hecho aquí. Crearíamos una pantalla de configuración para capturar esos valores. Para el campo To , hemos ingresado el valor HML (Lenguaje de marcado de la barra) que extraerá automáticamente el número de teléfono del destinatario de su cuenta.

Los parámetros de acciones en este ejemplo indican que hemos creado un tipo de Apex. Pero también podría ser estándar o Flow.

También debemos asignar esta extensión a la unidad de negocio correcta.

El siguiente paso habilita la extensión de la aplicación externa que creamos para sincronizar con Engagement Studio. Tendremos que asignar la clase de Apex ( SendTwilioSmsMessageActionMessage ) al perfil de usuario de integración B2BMA.

Por lo tanto, navegue hasta ese perfil de usuario, desplácese hasta la sección Acceso a clase de Apex habilitado y presione Editar . Aquí, podemos ver la clase de Apex en la columna de la izquierda, por lo que solo debemos presionar Agregar para agregarla a la columna de la derecha y habilitarla, y luego presionar el botón Guardar . Si regresamos a la página Perfil, podemos ver que la clase ahora está habilitada.

Eso es todo para el trabajo de administración. En este punto, podríamos entregárselo a nuestra gente de marketing, para que ahora puedan usar nuestra acción recién creada en Engagement Studio.

Pasos para el vendedor

Los especialistas en marketing querrán enviar mensajes SMS a sus clientes potenciales a través de Twilio, por lo que vamos a crear un programa simple que lo muestre. Primero, sigamos adelante y creemos nuestro nuevo programa. Luego, seleccionaremos nuestra nueva acción llamada TwilioSendSMS .

Todo lo que tenemos que hacer ahora es ponerlo en el cuerpo del mensaje SMS y listo. ¡No queda nada más que hacer después de esto, excepto ejecutar nuestro nuevo programa Engagement Studio!

¿Eres un ISV?

Si somos un ISV que quiere que otros se integren fácilmente con nuestro servicio externo, querremos crear un paquete administrado y cargarlo en AppExchange. Esto permite que otros utilicen fácilmente la acción invocable que hemos escrito y les niega la necesidad de tener que escribir su propio código Apex. También nos gustaría crear una pantalla de configuración para nuestro paquete que solicite las credenciales de Twilio y la unidad de negocios para usar en la integración.

¡Vea estas nuevas funciones en acción!

No se olvide de ver la repetición de Winter '23 Developer Preview para ver demostraciones de un subconjunto de estas nuevas y emocionantes funciones. ¡Asegúrese de consultar Learn MOAR Winter '23 for Developers Trailmix para obtener más información sobre Learn MOAR!

Sobre el Autor

Gary Ogden es ingeniero en Salesforce. Ha estado creando grandes cosas para los clientes de Salesforce durante más de seis años. Sigue a Gary en LinkedIn .

Obtenga las últimas publicaciones de blog de desarrolladores de Salesforce y episodios de podcast a través de Slack o RSS.

Agregar a Slack Suscríbete a RSS

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2022/09/learn-moar-in-winter-23-with-pardot-external-actions.html

Categories
Developers Tutoriales de Salesforce

La guía para desarrolladores de Dreamforce 2022 ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

La guía para desarrolladores de Dreamforce 2022 | Blog de desarrolladores de Salesforce

¡Llamando a todos los desarrolladores! ¡Bienvenido de nuevo a Dreamforce! El equipo de relaciones con los desarrolladores está ansioso por compartir lo que le espera en Dreamforce 2022. Todos están trabajando arduamente para brindarle un programa de sesiones y experiencias atractivas, ya sea que asista en persona o lo vea en Salesforce+ . Hemos preparado esta práctica guía para que aproveches al máximo tu experiencia Dreamforce. ¡No puedo esperar a verte allí y celebrar nuestra comunidad!

Fiesta del día 0 del desarrollador

¡Encuéntranos en Developer Galaxy para celebrar los 20 años de Dreamforce entre tus compañeros desarrolladores! Estará en una compañía estelar cuando se unan las superestrellas de los desarrolladores de Salesforce, MuleSoft, Slack y Tableau. Únase a nosotros la noche anterior al inicio de Dreamforce para disfrutar de comidas, bebidas y diversión con la comunidad. Se requerirá prueba de registro de Dreamforce para ingresar.

📆 Marque sus calendarios: 19 de septiembre, 7:00 pm PT @ Temple SF
Haz clic para registrarte en el Dev Day 0

Discurso principal sobre el futuro del desarrollo

La Keynote para desarrolladores de Salesforce debe ser la piedra angular de su experiencia con Dreamforce. La energía, la innovación y las historias de los clientes serán verdaderamente inspiradoras.

Le mostraremos cómo puede utilizar todo el poder de Salesforce Customer 360 para impulsar el impacto en su empresa, en su carrera y en sus comunidades. Verá demostraciones en vivo de las últimas funciones para desarrolladores en acción, aprenderá consejos prácticos de sus compañeros y se irá con información e inspiración para abrir camino con Salesforce.

Si lo va a seguir desde su casa, vea el discurso de apertura completo mientras se transmite en vivo en Salesforce+ . Asegúrese de ver el discurso de apertura en vivo con la interpretación del lenguaje de señas americano (ASL).

🎤 Oradores destacados: Christophe Coenraets, Andy Fawcett, Ananya Jha, Sue Berry, Jeremiah Peoples, Greg Whitworth
📅 Marquen sus calendarios: 20 de septiembre, 1:00 p. m. PT
Haga clic para agregar el Keynote sobre el futuro del desarrollo a su agenda

Mejora de habilidades en la vía del desarrollador

Para 2022, Developer Track tiene una combinación de sesiones de teatro de 20 minutos en Developer Theatre y sesiones de 40 minutos. Aprenderá habilidades y conocimientos importantes tanto de los expertos que crearon los productos como de sus pares en la comunidad que los han dominado.

Espere recibir mejores prácticas, consejos y mucha inspiración de desarrolladores de todo el mundo. ¡Y hay algo para todos, sin importar los temas que te apasionen! Tenemos sesiones para todos los niveles (principiante, intermedio, avanzado) en todas las funciones y temas: Automatización, Salesforce Flow, MuleSoft RPA, Transformación digital, DevOps Center, Salesforce y AWS, Anypoint Code Builder, Slack, Lightning Web Components y más.

📍 Las sesiones de Developer Theatre serán en Developer Grove en el primer piso de Moscone West. Las sesiones de trabajo de Developer Track se llevarán a cabo en el segundo piso de Moscone West. Asegúrese de revisar su agenda para conocer las ubicaciones exactas de las habitaciones. ¡Y por primera vez, estaremos transmitiendo algunas sesiones de seguimiento de desarrolladores en Salesforce+! Mírelo en vivo , mírelo con interpretación ASL o mire la repetición más tarde .

Algunas sesiones imperdibles

Para encontrar estas sesiones en el catálogo de Dreamforce , seleccione "Funciones" en la navegación de la izquierda y marque "Desarrollador" para ver todas las sesiones etiquetadas para desarrolladores.

Desarrolle API más rápido con Anypoint Code Builder
Ponentes: Simone Geib y Rohan Vettiankal
Qué esperar: Obtenga información sobre la próxima versión beta abierta de Anypoint Code Builder, el IDE de próxima generación de MuleSoft para diseñar, desarrollar e implementar API e integraciones.
Pulsa para añadir esta sesión a tu agenda

Developer Luminary: la nueva API Pub/Sub
Ponente: Tyson Read
Qué esperar: El Pub/Sub API es la última forma de crear integraciones basadas en eventos con Salesforce. Venga a conocer las nuevas características que esta API tiene para ofrecer y cómo Salesforce está construyendo para escalar. Inmediatamente después, habrá una sesión de preguntas y respuestas de 20 minutos dirigida por Tyson en Developer Campfire.
Pulsa para añadir esta sesión a tu agenda

Lo que necesita saber acerca de las pruebas traseras, frontales y de extremo a extremo
Ponente: Philippe Özil
Qué esperar: aprenda cómo pasar de pruebas de back-end con Apex a pruebas de front-end con Jest y Lightning Web Components, y cubriremos las pruebas de extremo a extremo (E2E) con el modelo de automatización de pruebas de interfaz de usuario (UI Testing Automation Model, UTAM). .
Pulsa para añadir esta sesión a tu agenda

Primeros pasos con Salesforce DevOps
Ponentes: Gilson Canario y Nicolás Piccolo
Qué esperar: ¿Está buscando comenzar a adoptar prácticas de DevOps pero no está seguro de cómo comenzar? Venga a escuchar cómo puede comenzar a tomar medidas hoy para iniciarse en un viaje de Salesforce DevOps.
Pulsa para añadir esta sesión a tu agenda

Trabajar con CORS y CSP para llamar a las API desde LWC
Ponentes: Aditya Naag Topalli
Qué esperar: en esta sesión, exploraremos el motivo detrás de los errores comunes de la API y cómo solucionarlos. Únase a esta sesión para ver en profundidad cómo utilizar con éxito estas técnicas de integración.
Pulsa para añadir esta sesión a tu agenda

Salesforce en funciones de Salesforce
Ponentes: Christopher Marino y Ben Gray
Qué esperar: aprenda cómo Salesforce está usando Functions internamente para identificar duplicaciones de objetos y reducir la redundancia de datos en más de 100 000 cuentas todos los días.
Pulsa para añadir esta sesión a tu agenda

Desbloquee la productividad del desarrollador con herramientas modernas
Ponentes: Mohith Shrivastava
Qué esperar: esta sesión le mostrará cómo usar Code Builder y DevOps Center para crear e implementar rápidamente aplicaciones de Salesforce mientras mantiene el control y la gestión de cambios.
Pulsa para añadir esta sesión a tu agenda

Pregúntame cualquier cosa con los desarrolladores de Salesforce
Oradores: Peter Chittum, Christie Fidura, Gursev Singh Kalra y Ben Sklar
Esta sesión será el mejor lugar para obtener sus respuestas en Dreamforce '22, de nuestros mejores expertos. Únase a esta sesión de teatro con un panel de defensores de desarrolladores de Salesforce que responderán sus preguntas en vivo.
Pulsa para añadir esta sesión a tu agenda

Qué esperar en Developer Grove

Developer Grove es tu hogar para la comunidad de desarrolladores durante Dreamforce.

Únase a nosotros para ponerse manos a la obra con los Mini Hacks. Cree LWC con bibliotecas JS externas. Cree un complemento personalizado para la CLI unificada. Integre con la sede digital de Slack. Cree una visualización de datos de Tableau personalizada e insértela en Salesforce. Y este año te animamos a hackear con un compañero. Como siempre para Mini Hacks, tendremos expertos en productos disponibles para ayudarlo a completar con éxito estos proyectos prácticos, divertidos y del tamaño de un bocado.

Developer Campfire presenta charlas interactivas cada 30 minutos. Aprenderá sobre importantes proyectos de código abierto y herramientas de desarrollo para Salesforce Platform, MuleSoft, Slack y Tableau. También podrá profundizar más con las sesiones extendidas de preguntas y respuestas sobre los estándares web, los depuradores de Apex, la CLI de Salesforce y la API Pub/Sub.

Los miembros del equipo de relaciones con desarrolladores estarán en Developer Grove durante la duración de Dreamforce, así que visítanos para decir "Hola". ¡Nos encantaría verte!

Noche de juegos para desarrolladores

¿Eres más inteligente que un promotor de desarrolladores? Ven a probar tus conocimientos en un divertido juego de Dev Trivia y compite por la oportunidad de ganar el derecho a fanfarronear y fantásticos premios.

📅 Marque sus calendarios: 20 de septiembre a las 5:00 p. m. PT en el Developer Theatre
Haz clic para agregar Dev Game Night a tu agenda

Preparación para el lanzamiento de Winter '23 en vivo: ¡Vista previa del desarrollador!

Release Readiness Live es en persona en Dreamforce '22! Conozca las funciones principales para desarrolladores de la versión Winter '23. Nos sumergiremos en las nuevas API de GraphQL, la creación de acciones externas para compromisos de cuenta con Apex y las próximas actualizaciones de Salesforce Flow, incluida la incorporación de flujos de pantalla en LWC. A esto le seguirá una sesión de preguntas y respuestas en vivo donde podrá obtener respuestas a todas sus preguntas.

🎤 Oradores destacados: Danielle Larregui, Rene Winkelmeyer, Suvda Myagmar, Sam Reynard y Christopher Cornett
📅 Marquen sus calendarios: 22 de septiembre, 11:00 am PT
Pulsa para añadir RRL a tu agenda

Main Show Keynote y True to the Core

Dreamforce comenzará oficialmente el martes 20 de septiembre con la presentación principal de Dreamforce con los codirectores ejecutivos Marc Benioff y Bret Taylor, ¡junto con invitados especiales!

¡Y el jueves 22 de septiembre, True to the Core regresa para Dreamforce 2022! Únase al cofundador y CTO Parker Harris, al director de productos David Schmaier y a los líderes de productos en un foro de preguntas y respuestas en vivo sobre nuestra hoja de ruta de productos.

Si nunca ha asistido, True to the Core es una excelente sesión para que los desarrolladores hagan preguntas y escuchen las respuestas de nuestros gerentes de producto. Una cosa que seguirá siendo "central" para True to the Core es que habrá muchas preguntas.

📅 Marquen sus calendarios: 20 de septiembre, 10:00 am PT
Pulsa para añadir la Keynote a tu agenda

📆 Marquen sus calendarios: 22 de septiembre a las 12:00 p. m. PT
Haga clic para agregar True to the Core a su agenda

Obtenga aún más contenido en Salesforce+

¡Este año, Salesforce+ tendrá una experiencia de transmisión EN VIVO! Así es, durante los tres días, habrá dos canales, 72 horas de transmisión en vivo y adquisiciones globales.

Además de la experiencia en vivo, este año, estarán disponibles más de 200 sesiones a pedido repletas de contenido y momentos exclusivos. ¿Entusiasmado? ¡Usted debería ser! Mire el contenido de desarrollo de Dreamforce en vivo , mírelo con interpretación ASL o mire la repetición más tarde .

¡Prepárate ahora!

¿Que estas esperando? ¡Estos son los pasos que puede seguir hoy para prepararse para Dreamforce '22!

  1. Empiece a pensar sobre qué productos o funciones desea obtener más información. ¿Qué proyectos planea emprender el próximo año que podrían beneficiarse de los consejos y las mejores prácticas?
  2. ¡Planea, planea, planea! Eche un vistazo a Agenda Builder, lea sobre todas las sesiones disponibles y comience a planificar su calendario de Dreamforce '22.
  3. Asegúrese de agregar el discurso principal sobre el futuro del desarrollo a su agenda.
  4. Conéctese con sus pares en el grupo de la comunidad Developer Trailblazer .
  5. Si no asistirá en persona, asegúrese de registrarse para la experiencia Salesforce+ .
  6. Siga a @SalesforceDevs en Twitter y LinkedIn para obtener más actualizaciones.

Obtenga las últimas publicaciones de blog de desarrolladores de Salesforce y episodios de podcast a través de Slack o RSS.

Agregar a Slack Suscríbete a RSS

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2022/09/the-developers-guide-to-dreamforce-2022.html

Categories
Developers

Cómo obtener la URL base de la organización de Salesforce en Flow

Última actualización el 25 de abril de 2022 por Rakesh Gupta

Gran idea o pregunta duradera:

  • ¿Cómo obtiene la URL base de su organización de Salesforce (incluida la comunidad) y la URL completa del registro en Flow?

Objetivos:

Después de leer este blog, podrá:

  • Obtenga la URL base de su organización de Salesforce en el flujo
  • Obtener la URL de la comunidad actual en el flujo
  • Obtenga la URL completa del registro cuando pase la identificación de la red
  • y mucho más

Arda Turan trabaja como administradora de sistemas en Gurukul on Cloud (GoC) . Arda quiere saber cuál es la forma más fácil y segura de obtener la URL base de la organización de Salesforce y una URL completa de registro (si pasa el ID de registro).

Enfoque de Campeón de Automatización (I-do):

Una de las preguntas comunes que he visto en la comunidad es: ¿de quién obtengo la URL base de la organización de Salesforce para poder construir una URL completa de registro o usarla en el correo electrónico saliente? Hay múltiples soluciones posibles para el requisito anterior.

La forma más segura es llamar a getSalesforceBaseUrl() , el método de URL de una clase de Apex invocable. El método getSalesforceBaseUrl() devuelve la URL de la conexión actual a la organización de Salesforce. Mientras que toExternalForm() devuelve una representación de cadena de la URL actual.

Comencemos a construir este proceso de automatización.

Práctica guiada (nosotros hacemos):

Hay 2 pasos para resolver el requisito comercial de Arda utilizando Screen Flow . Debemos:

  1. Crear clase de Apex y clase de prueba
  2. Pasos de flujo de Salesforce:
    1. Definir propiedades de flujo para el flujo de pantalla
    2. Agregue una variable de texto para almacenar la URL base de la organización
    3. Agregue una variable de texto para almacenar la URL completa de la cuenta
    4. Agregue un elemento de obtención de registros para encontrar la cuenta 'Clientes sin cuenta' Id.
    5. Agregar acción: llamar a una clase de Apex para obtener la base de la organización y registrar las URL completas
    6. Agregar una pantalla para mostrar las URL
      1. Agregue un componente de texto para mostrar para mostrar la URL base de la organización y registrar la URL completa

Paso 1: Cree una clase de Apex y una clase de prueba

  1. Haga clic en Configuración .
  2. En el cuadro Búsqueda rápida, escriba Clases de Apex .
  3. Da clic en el botón Nuevo .
  4. Copie el código de GitHub y péguelo en su clase de Apex.
  5. Haga clic en Guardar.

Repita los pasos anteriores y haga clic en la clase de prueba. Puede obtener el código de mi repositorio de GitHub .

Paso 2.1: Definir propiedades de flujo

  1. Haga clic en Configuración .
  2. En el cuadro Búsqueda rápida, escriba Flujos .
  3. Seleccione Flujos y luego haga clic en Nuevo flujo .
  4. Seleccione el flujo de pantalla   opción y haga clic en Crear y configurar el flujo.
  5. Se abrirá el diseñador de flujo para usted.

Paso 2.2: Cree una variable de texto para almacenar la URL base de la organización

El propósito de crear una variable de texto es almacenar la URL base de la organización devuelta por la clase Apes invocable.

  1. En Caja de herramientas , seleccione Administrador y luego haga clic en Nuevo recurso para almacenar la URL base de la organización.
  2. Ingrese la siguiente información:
    1. Tipo de recurso : Variable
    2. Nombre de la API : varT_baseURL
    3. Tipo de datos : Texto
    4. Valor predeterminado: {!$GlobalConstant.EmptyString}
    5. Comprobar disponible para entrada
    6. Comprobar disponible para la salida
  3. Haga clic en Listo .

Paso 2.3: cree una variable de texto para almacenar la URL completa de la cuenta

El propósito de crear una variable de texto es almacenar la devolución de URL completa de la cuenta por parte de la clase Apes invocable.

  1. En Caja de herramientas , seleccione Administrador y luego haga clic en Nuevo recurso para almacenar la URL completa de la cuenta.
  2. Ingrese la siguiente información:
    1. Tipo de recurso : Variable
    2. Nombre de la API : varT_accountFullUrl
    3. Tipo de datos : Texto
    4. Valor predeterminado: {!$GlobalConstant.EmptyString}
    5. Comprobar disponible para entrada
    6. Comprobar disponible para la salida
  3. Haga clic en Listo .

Paso 2.4: Adición de un elemento Obtener registro para encontrar los detalles de la cuenta 'Clientes sin cuenta'

El siguiente paso es usar el elemento Obtener registros para encontrar los detalles de 'Clientes sin cuenta'.

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Obtener registros .
  2. Introduzca un nombre en el campo Etiqueta ; el nombre de la API se completará automáticamente.
  3. Seleccione el objeto Cuenta de la lista desplegable.
  4. Seleccione Se cumplen todas las condiciones (Y) .
  5. Establecer condiciones de filtro
    1. Fila 1:
      1. Campo : Nombre
      2. Operador : Igual
      3. Valor : Clientes sin Cuenta
  6. Cuántos registros almacenar:
    1. seleccione Solo el primer registro
  7. Cómo almacenar datos de registro:
    1. Elija la opción para Almacenar automáticamente todos los campos .
  8. Haga clic en Listo .

Paso 2.5: agregue una acción para llamar a la clase de Apex para obtener la base de la organización y registrar las URL completas

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Acción .
  2. Busque y seleccione la clase apex GetOrgBaseUrl en el menú desplegable
  3. Introduzca un nombre en el campo Etiqueta ; el nombre de la API se completará automáticamente.
  4. Seleccionar Objetos: Cuenta
  5. Establecer valores de entrada:
    1. Campo : registros de origen
    2. Valor : {!Get_Account}
  6. Seleccione Asignar variables manualmente .
  7. Almacenar valores de salida:
    1. Fila 1:
      1. Campo : sfdcBaseURL
      2. Valor : {!varT_baseURL}
    2. Fila 2:
      1. Campo : sfdcRecordURL
      2. Valor : {!varT_accountFullUrl}
  8. Haga clic en Listo .

Paso 2.6: agregue un elemento de pantalla para mostrar las URL

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Pantalla .
  2. Ingrese la siguiente información :
    1. Ingrese la etiqueta , el nombre de la API se completará automáticamente.
  3. Haga clic en Listo .

Paso 2.6.1: agregue un componente de texto de visualización para mostrar la base de organización y la URL completa del registro de cuenta

  1. En la sección Entrada en Elemento de pantalla , arrastre y suelte el componente Mostrar texto en la pantalla.
  2. Ingrese la siguiente información :
    1. Introduzca un nombre en el campo Nombre de API .
    2. Escriba su mensaje en el cuadro de texto.

Al final, Arda's Flow se verá como la siguiente captura de pantalla:

Una vez que todo se vea bien, realice los siguientes pasos:

  1. Haga clic en Guardar .
  2. Introducir etiqueta de flujo   el nombre de la API se completará automáticamente.
  3. Haga clic en Mostrar avanzado .
  4. Versión de API para ejecutar el flujo : 55
  5. Etiqueta de entrevista : Flujo para obtener direcciones URL de Salesforce {!$Flow.CurrentDateTime}
  6. Haga clic en Guardar .


¡Casi ahí! Una vez que todo se vea bien, haga clic en el botón Activar .

Prueba de concepto

A partir de ahora, cuando un usuario empresarial ejecute el flujo de pantalla, se mostrará automáticamente la URL base de la organización, así como la URL completa de la cuenta dada.

Siéntase libre de llamar a la clase de simios invocables desde cualquier tipo de flujo.

Evaluación formativa:

¡Quiero saber de ti!

¿Qué es una cosa que aprendiste de esta publicación? ¿Cómo imagina aplicar este nuevo conocimiento en el mundo real? Siéntase libre de compartir en los comentarios a continuación.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2022/04/25/how-to-get-salesforce-org-base-url-in-flow-2/

Categories
Developers Tutoriales de Salesforce Uncategorized

Demostraciones de aplicaciones del Desafío para desarrolladores de la ASEAN ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

En los últimos meses, más de 3.000 participantes han estado aprendiendo a crear aplicaciones empresariales de Salesforce Developer Advocates y Trailhead como parte del Desafío para desarrolladores de la ASEAN. Todos los que se registraron y completaron el programa recibieron un vale de certificación de Salesforce de $ 200, y siete participantes enviaron aplicaciones que crearon para ser exhibidas en el evento Demo Day organizado por Salesforce para cerrar el programa.

Los constructores muestran su código

El día de demostración del Desafío de desarrolladores de la ASEAN tuvo lugar el 28 de octubre a las 10:00 a. M. SGT. Ya está disponible una grabación del evento. Siete participantes del Desafío de desarrolladores de la ASEAN mostraron las aplicaciones que crearon ante un panel de tres miembros: Jawad Malik, jefe de ventas regionales, Ian Douglas, director sénior de ingeniería de soluciones y Satya Sekhar, promotor de desarrolladores de Salesforce. El desarrollador evangelista de Salesforce, Terence Lim, fue el anfitrión del evento y Robert Newell, vicepresidente de ingeniería de soluciones de Salesforce, pronunció un discurso de apertura. Aquí hay una breve descripción de los participantes y sus aplicaciones.

Aries Brylle Ventura creó una aplicación para el registro y monitoreo de la vacuna COVID-19

Aries es actualmente consultor de Salesforce en Simplus Philippines Inc. Aries llamó a su aplicación VaxxSafe, una herramienta para ayudar a administrar las vacunas COVID-19. La aplicación tiene un panel para brindar una descripción general del esfuerzo de vacunación. Aries ha utilizado el objeto de la cuenta para realizar un seguimiento de los municipios. La aplicación se puede conectar a sistemas fuera de Salesforce y se puede utilizar para rastrear diferentes vacunas. También se incluye la gestión de equipos y horarios.

Del panel: Jawad destacó la relevancia de VaxxSafe en el mundo actual y comentó cómo una aplicación de este tipo podría ayudar a otras empresas en sus estrategias de regreso al trabajo. Satya preguntó acerca de las notificaciones que envía VaxxSafe. Ian se refirió a la necesidad de una buena seguridad para proteger la privacidad y los datos de salud personales de los usuarios de la aplicación.

Mira la demostración de Aries aquí .

Jescy Querimit creó un catálogo de productos con asignación de unidades

Jescy es un desarrollador de Salesforce en VRP Consulting y tiene más de 10 años de experiencia. Comenzó como desarrollador de Java antes de cambiar al desarrollo de Salesforce. Jescy creó un catálogo de productos para un hipotético vendedor mayorista de computadoras portátiles que también quería comenzar a vender en los mercados minoristas. Su aplicación incluía integraciones de MuleSoft, así como procesamiento por lotes y carga de datos.

Desde el panel: Ian hizo preguntas sobre la flexibilidad de los datos y los datos de otros sistemas, mientras que Satya sondeó cómo los usuarios de una tienda usarían la aplicación. El panel quedó impresionado y encantado con la inclusión y el uso de MuleSoft para integraciones.

Mira la demostración de Jescy aquí .

Rena Eznaira C. Era creó una aplicación de gestión de eventos

Rena estudió en la Universidad Politécnica de Filipinas y acaba de comenzar su carrera en la industria de la tecnología como desarrolladora de ventas B2B y Service Cloud. Actualmente es Consultora Asociada en Simplus. Rena creó una aplicación que ayuda a los usuarios a programar un evento, administrar asistentes y administrar cambios.

Desde el panel: Ian hizo preguntas para explorar qué inspiró a Rena a crear esta aplicación. Rena respondió que se inspiró en un proyecto que había realizado anteriormente y que imagina que la aplicación irá más allá de los eventos para programar y administrar aún más actividades. Satya sugirió agregar un calendario para ver el calendario de eventos.

Mira la demostración de Rena aquí .

Christian Abellanosa construyó un sistema de seguimiento de envíos

Al igual que Rena, Christian también es nuevo en el ecosistema de Salesforce y trabaja para Simplus Filipinas. Christian creó un sistema de seguimiento de envíos similar a UPS, FedEx o DHL. Su aplicación genera códigos de seguimiento e incluso tiene un componente Lightning para mostrar el envío en un mapa.

Desde el panel: Jawad quedó impresionado de que Christian solo tardó tres días en crear una aplicación tan funcional, un testimonio de lo poderosa que puede ser la plataforma Salesforce. Satya hizo preguntas sobre automatizaciones para el seguimiento de envíos.

Mira la demostración de Christian aquí .

Le Minh Quan creó una aplicación de fitness

Minh Quan trabaja actualmente en ArrowHiTech JSC como desarrollador de Salesforce en Vietnam. Creó una aplicación que usa objetos personalizados para almacenar entrenamientos y ha aprovechado funciones para calcular automáticamente estadísticas como calorías quemadas y tiempo de entrenamiento. La aplicación también podría eventualmente almacenar información sobre música de entrenamiento.

Desde el panel: Jawad animó a Minh Quan a investigar más la gamificación de la aplicación. Satya profundizó en los informes que la aplicación podría ofrecer.

Mira la demostración de Minh Quan aquí .

Nguyen Manh Tâm construyó un parque tecnológico

Nguyen Manh Tâm es un ingeniero de software de 25 años de Vietnam. Tâm construyó un parque tecnológico que contenía una amplia variedad de modelos de teléfonos móviles para importar y exportar. Aprovechó LWC para mostrar los productos en la aplicación y configuró los flujos de trabajo de creación y aprobación de casos.

Desde el panel: Jawad e Ian estaban entusiasmados con la idea de extender la idea a los teléfonos corporativos y las políticas de dispositivos. Potencialmente, podría mejorar la experiencia general de los empleados.

Mira la demostración de Tâm aquí .

Clyde Enrique A. Tan creó un componente para importar datos en masa para el objeto de la cuenta

Clyde ha sido desarrollador de Salesforce desde diciembre de 2018 y tiene un profundo conocimiento técnico sobre Apex, LWC y VisualForce. Es un desarrollador líder en Simplus y aspira a ser un arquitecto técnico en el ecosistema de Salesforce algún día. Clyde creó un componente en lugar de una aplicación. Su componente utiliza LWC y eventos de plataforma para validar, limpiar e importar grandes cantidades de registros al objeto de la cuenta.

Del panel: A Ian le encantó la diversidad de ideas que se estaban presentando e investigó a Clyde sobre los próximos pasos que tenía en mente. Satya apreció el enfoque de Clyde y consideró que era una forma sólida de garantizar que los datos se mantengan limpios cuando se cargan.

Mira la demostración de Clyde aquí .

Gratitud y agradecimiento

Queremos agradecer a todos los desarrolladores que compartieron sus demostraciones de aplicaciones en el Demo Day. Se necesita mucha habilidad y coraje para presentar algo que se construye, y aplaudimos a todos los participantes que presentaron su trabajo. También estamos agradecidos con todos los que participaron en el Desafío para desarrolladores de la ASEAN. Fue nuestra primera iniciativa en la región que se centró únicamente en los desarrolladores de Salesforce y nuestros pioneros. Hemos aprendido mucho y esperamos utilizar lo que hemos aprendido para seguir inspirándolo a crear soluciones asombrosas utilizando la plataforma Salesforce.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/11/app-demos-from-the-asean-developer-challenge.html

Categories
Developers Salesforce

Introducción a Salesforce Flow – Parte 74 (Implementar flujos o procesos mediante el código de Visual Studio)

Última actualización el 16 de octubre de 2021 por Rakesh Gupta

Gran idea o pregunta duradera:

¿Cómo se implementan los flujos o procesos con el código de Visual Studio?

Objetivos:

Después de leer esta publicación de blog, el lector podrá:

  • Comprender cómo usar el código de Visual Studio para implementar flujos
  • Comprender cómo el código de Visual Studio para implementar procesos
  • Implemente componentes en cualquier organización utilizando Visual Studio Code

Pamela Kline trabaja como administradora de sistemas en Universal Container. Ha desarrollado la selección automática de registros de seguimiento automático que creo el flujo de casilla de verificación en la organización Organization Developer Sandbox ( Dev3 ) y ha terminado con las pruebas. Quiere implementar este flujo en su otro entorno de pruebas para desarrolladores (Dev4).

Enfoque de campeón de automatización (I-do):

Esta es una continuación de mi último artículo sobre la distribución de flujos o procesos mediante paquetes . En este artículo, voy a discutir cómo implementar un proceso / flujo usando el código de Visual Studio . Visual Studio Code es el editor de código de referencia para los desarrolladores de S alesforce.

Salesforce Extensions para Visual Studio Code proporciona una interfaz unificada para crear e implementar aplicaciones en la plataforma Salesforce. El paquete Salesforce Extension incluye herramientas para desarrollar en la plataforma Salesforce en el editor de código VS ligero y extensible. Estas herramientas proporcionan funciones para trabajar con organizaciones de desarrollo (organizaciones de scratch, sandboxes y organizaciones DE), Apex, componentes Aura y Visualforce.

Código Visual Studio nos permite desplegar los flujos y procesos en diferentes entornos, por ejemplo, Developer Edition org y Org Producción. Comencemos con un caso de uso empresarial.

Antes de continuar, debe instalar y configurar el código de Visual Studio. Consulte este enlace para descargar, instalar y configurar VS Code y Salesforce Extension . Siga las instrucciones a continuación para crear un proyecto e implementarlo en otra organización de Salesforce.

  1. El primer paso es crear un proyecto siguiendo los pasos a continuación:
    1. Abra Visual Studio Code , haga clic en Ver | Paleta de comandos.
    2. Seleccione SFDX: Crear proyecto con manifiesto , seleccione la plantilla Estándar y presione Entrar .
    3. Escriba el nombre del proyecto FlowDeployment y presione Entrar .
    4. Seleccione su Escritorio como el lugar para guardar el proyecto para que sea fácil de encontrar más adelante.
    5. Espere a que la nueva ventana de Visual Studio Code abra el editor.
  2. El segundo paso es autorizar la organización de origen, es decir, Dev3 en el escenario:
    1. Vaya a Visual Studio Code , haga clic en Ver | Paleta de comandos .
    2. Seleccione SFDX: Autorizar una organización , seleccione la opción Sandbox.
    3. Ingrese el alias Dev3 y presione Enter .
    4. Siga las instrucciones en pantalla para otorgar acceso a su organización a la aplicación conectada.
    5. Al final, asegúrese de estar conectado a la organización correcta, es decir, Dev3 en este escenario.
  3. El siguiente paso para recuperar los componentes de metadatos exactos que desea implementar. En esta demostración, implementará Flow Record_Triggered_user_Before_Save . Navegue hasta Org Browser y luego expanda el Flow para descargar los componentes Record_Triggered_user_Before_Save , como se muestra en la siguiente captura de pantalla.
  4. Una vez que haya terminado con la descarga de componentes, vaya a Explorer | Proyecto | Fluir.
  5. Su proyecto ahora debería verse como la siguiente captura de pantalla.
  6. El siguiente paso es implementarlo en nuestro entorno Dev4 Sandbox. Antes de continuar, hagamos una pausa aquí.
  7. Es hora de autorizar Target Org, es decir, Dev4 en el escenario:
    1. Vaya a Visual Studio Code , haga clic en Ver | Paleta de comandos .
    2. Seleccione SFDX: Autorizar una organización , seleccione la opción Sandbox.
    3. Ingrese el alias Dev4 y presione Enter .
    4. Siga las instrucciones en pantalla para otorgar acceso a su organización a la aplicación conectada.
    5. Al final, asegúrese de estar conectado a la organización correcta, es decir, Dev4 en este escenario.
  8. Haga clic con el botón derecho en el componente , luego haga clic en el botón SFDX: Implementar en la organización de origen para implementar el flujo en Dev4 .
  9. Después de una implementación exitosa , recibirá el mensaje que se muestra en la siguiente captura de pantalla.

Prueba de concepto

Evaluación formativa:

¡Quiero saber de ti!

¿Qué aprendiste de esta publicación? ¿Cómo imagina aplicar este nuevo conocimiento en el mundo real?

Avísame twitteando en @automationchamp, o búscame en LinkedIn.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2021/10/15/deploy-flows-or-processes-using-the-visual-studio-code/

Categories
Developers

Introducción a Salesforce Flow – Parte 70 (Creación de una lógica de uso compartido de registros personalizada)

👉 Entender cómo resolver el mismo caso de uso empresarial utilizando Process Builder y Salesforce Flow . Consulte este artículo Introducción a Process Builder – Parte 16 (Creación de una lógica personalizada para compartir registros) .

Gran idea o pregunta duradera:

  • Compartir registros automáticamente sin compartir reglas o jerarquía de roles
  • Uso de Apex Managed Sharing de forma declarativa

Objetivos:

Después de leer esta publicación de blog, el lector podrá:

  • Cree una automatización declarativa para compartir un registro automáticamente
  • Comparta un registro sin compartir reglas o jerarquía de roles
  • Cree un flujo activado por registro para insertar una fila en la tabla para compartir

Brenda David trabaja como administradora de sistemas en Universal Containers (UC). Actualmente, se encuentra trabajando en un proyecto que está implementando la gestión de auditoría de Activos. Para esto, ha creado una Auditoría de objetos personalizados ( OWD : – privado) y algunos campos personalizados como se muestra en la siguiente captura de pantalla:

Parte 16.1

Parte 16.1

El requisito comercial :

  • Tan pronto como se complete el campo Auditor__c (Buscar en objeto de usuario ), comparta automáticamente el registro de auditoría (Otorgar acceso de edición ) con el auditor.

Enfoque de campeón de automatización (I-do):

Salesforce le permite controlar el acceso a los datos en muchos niveles diferentes (nivel de objeto, nivel de registro y nivel de campo). Nos centraremos en los métodos para controlar el acceso a los datos a nivel de registro.

En la mayoría de los escenarios, puede usar configuraciones de uso compartido listas para usar para otorgar acceso a los registros, pero hay algunos casos de uso en los que debe escribir una regla de uso compartido administrado de Apex para compartir los registros con usuarios o grupos.

El uso compartido administrado de Apex le permite utilizar el código Apex para crear configuraciones de uso compartido sofisticadas y dinámicas que de otro modo no serían posibles. En este artículo, utilizaremos el flujo activado por registro posterior a la grabación para resolver los requisitos comerciales. Consulte este artículo para comprender por qué estamos usando el flujo activado por registro posterior al guardado para este escenario.

Antes de continuar, asegúrese de comprender la tabla para compartir en Salesforce . Todos los objetos que tienen una configuración de uso compartido predeterminada de Privado o Público de solo lectura . Estos objetos también tienen un objeto Compartir relacionado que es similar a una lista de control de acceso (ACL) que se encuentra en otras plataformas.

Todos los objetos compartidos para objetos personalizados se denominan CustomObject__Share , donde CustomObject__c es el nombre del objeto personalizado relacionado. Un objeto compartido incluye registros que admiten los tres tipos de uso compartido (uso compartido administrado de Force.com , uso compartido administrado por usuarios y uso compartido administrado de Apex ).

El objeto Compartir contiene los siguientes campos:

Nombre del campo Detalles
Identificación de los padres La identificación del registro que se comparte. Este campo no se puede actualizar.
UserOrGroupId La identificación del usuario al que le está otorgando acceso.
Nivel de acceso El nivel de acceso que se le ha otorgado al usuario o grupo especificado.
RowCause (también conocido como Sharing Reasons) El motivo por el que se concede acceso al usuario o grupo.

Antes de discutir la solución, permítame mostrarle un diagrama de un flujo de proceso a un alto nivel. Por favor, dedique unos minutos a revisar el siguiente diagrama de flujo y entiéndalo.

Comencemos a construir este proceso de automatización.

Práctica guiada (lo hacemos):

Hay 3 pasos para resolver los requisitos comerciales de Brenda mediante el flujo activado por registro después de guardar . Debemos:

  1. Crea un objeto personalizado con campos
  2. Crear motivo de intercambio de ápice
  3. Flujo de la fuerza de ventas
    1. Definir propiedades de flujo para flujo activado por registro
    2. Cree una variable de registro (varR_AuditShare) para almacenar Audit__Share
    3. Agregue un elemento de decisión para verificar si el auditor está poblado o no
    4. Agregar un elemento de asignación para completar la variable de registro (varR_AuditShare)
    5. Agregue un elemento de creación de registros para compartir el registro de auditoría con el auditor

Paso 1: crear campos y una auditoría de objetos personalizados

    1. Haga clic en Configuración .
    2. En el Administrador de objetos, haga clic en Crear | Objeto personalizado .
    3. Ahora cree una auditoría de objetos personalizados y campos como se muestra en la captura de pantalla a continuación:
    4. Haga clic en Guardar .

Parte 16.1

Parte 16.1

Paso 2: Cree un motivo para compartir Apex

Primero, crearemos un motivo para compartir Apex . Cada motivo de uso compartido de Apex tiene una etiqueta y un nombre . El valor de Etiqueta se muestra en la columna Razón cuando se visualiza el uso compartido de un registro en la interfaz de usuario. Esto permite a los usuarios y administradores comprender el origen del intercambio.

  1. Haga clic en Configuración .
  2. En el Administrador de objetos, escriba Auditoría .
  3. Seleccione Motivos para compartir Apex y luego haga clic en Nuevo .
  4. Ingrese la Etiqueta del motivo y presione la tecla Tab. Se completará el Nombre del motivo.
  5. Haga clic en Guardar.

Paso 3.1: Flujo de Salesforce – Definir propiedades de flujo

  1. Haga clic en Configuración .
  2. En el cuadro Búsqueda rápida, escriba Flujos .
  3. Seleccione Flujos y luego haga clic en Nuevo flujo .
  4. Seleccione el flujo activado por registro   y haga clic en Siguiente y configure el flujo de la siguiente manera:
    1. ¿Cómo quieres empezar a construir ? Freeform
    2. Objeto : Auditoría
    3. Activar el flujo cuando : se crea o actualiza un registro
    4. Establecer criterios de entrada
      1. Requisitos de condición: Ninguno
    5. Optimice el flujo para : acciones y registros relacionados
  5. Haz clic en Listo .

Paso 3.2: Flujo de Salesforce: cree una variable de registro para almacenar Audit__Share

  1. En Caja de herramientas , seleccione Administrador, luego haga clic en Nuevo recurso para almacenar el detalle de mapeo audit__share.
  2. Ingrese la siguiente información:
    1. Tipo de recurso : variable
    2. Nombre de API : varR_AuditShare
    3. Tipo de datos : registro
    4. Objeto : Audit__Share
    5. Verificar disponible para entrada
    6. Verificar disponible para salida
  3. Haz clic en Listo .

Paso 3.3: Flujo de Salesforce: uso del elemento de decisión para verificar si el campo Auditor está lleno o no

Ahora usaremos el elemento Decisión para verificar el Auditor__c del objeto Auditoría para encontrar si está poblado por el usuario o no.

  1. En Caja de herramientas , seleccione Elemento .
  2. Arrastre y suelte el elemento Decisión en el diseñador de flujo.
  3. Ingrese un nombre en el campo Etiqueta; el nombre de la API se completará automáticamente.
  4. En Detalles del resultado ,   ingrese la etiqueta que el nombre de la API se completará automáticamente.
  5. Requisitos de condición para ejecutar el resultado : se cumplen todas las condiciones (Y)
    1. Fila 1 :
      1. Recurso: {! $ Record.Auditor__c}
      2. Operador: es nulo
      3. Valor: {! $ GlobalConstant.False}
    2. Agregue campo
    3. Fila 2:
      1. Recurso: {! $ Record.Auditor__c}
      2. Operador: se cambia
      3. Valor: {! $ GlobalConstant.True}
  6. Haz clic en Listo .

Paso 3.4: Flujo de Salesforce: agregar un elemento de asignación para completar Audit__Share Record Variable

El siguiente paso es completar la variable de registro Audit__share para compartir el registro de auditoría con Auditor.

  1. En Caja de herramientas , seleccione Asignación . Arrastre y suelte Tarea en el lienzo.
  2. Ingrese la siguiente información :
    1. Ingrese la etiqueta, el nombre de la API se completará automáticamente.
    2. Fila 1:
      1. Campo : {! VarR_AuditShare.AccessLevel}
      2. Operador : Igual que
      3. Valor : Editar
    3. Haga clic en Agregar fila
    4. Fila 2:
      1. Campo : {! VarR_AuditShare. Identificación de los padres}
      2. Operador : Igual que
      3. Valor : {! $ Record.Id}
    5. Haga clic en Agregar fila
    6. Fila 3:
      1. Campo : {! VarR_AuditShare. UserOrGroupId}
      2. Operador : Igual que
      3. Valor : {! $ Record.Auditor__c}
    7. Haga clic en Agregar fila
    8. Fila 4:
      1. Campo : {! VarR_AuditShare. RowCause}
      2. Operador : Igual que
      3. Valor : Share_record_with_Auditor__c
  3. Haz clic en Listo .

Paso 3.5: Flujo de Salesforce: agregar un elemento Crear registros para compartir el registro de auditoría con el auditor

  1. En Caja de herramientas , seleccione Elemento .
  2. Arrastre y suelte el elemento Crear registros en el diseñador de flujo.
  3. Ingrese un nombre en el campo Etiqueta; el nombre de la API se completará automáticamente.
  4. Para cuántos registros crear, seleccione uno.
  5. Colección de registros de mapas : {! VarR_AuditShare}
  6. Haz clic en Listo .

Al final, el flujo de Brenda se verá como la siguiente captura de pantalla (activé el diseño automático ) para este flujo:

Una vez que todo se vea bien, realice los pasos a continuación:

  1. Haga clic en Guardar .
  2. Ingrese la etiqueta de flujo, el nombre de la API se completará automáticamente.
  3. Haga clic en Mostrar avanzado .
  4. Versión de API para ejecutar el flujo : 53
  5. Etiqueta de la entrevista : compartir registro con el auditor {! $ Flow.CurrentDateTime}
  6. Haga clic en Guardar .

¡Casi ahí! Una vez que todo se vea bien, haga clic en el botón Activar.

Prueba de concepto

A partir de ahora, cuando un usuario empresarial crea un registro de auditoría con un auditor, Salesforce Flow se activará automáticamente y compartirá el registro de auditoría con el auditor. Tendrá que hacer algunas de estas pruebas en su organización.

  1. Cu rrently, la auditoría para Dell PowerEdge Servidores Torre FY21 no tiene un auditor, como se muestra en la siguiente captura de pantalla:
  2. Ahora actualice el registro de auditoría con el auditor válido:
  3. Para verificar el resultado, haga clic en el botón compartir , se abrirá un detalle como se muestra en la siguiente captura de pantalla:

Práctica independiente (tú lo haces):

  • En una organización de sandbox o de desarrollo / Trailhead, cree un objeto personalizado rápido con una búsqueda del registro de oportunidad
    • Incluir una búsqueda de usuario
  • Cree una regla para compartir como se describe anteriormente

Evaluación formativa:

¡Quiero saber de ti!

¿Qué aprendió de esta publicación, es relevante para usted y cómo modificará los conceptos enseñados en la publicación para sus propios procesos comerciales?

Haz una publicación y etiquétame en Twitter @automationchamp usando #AutomationChampionFlow.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2021/09/30/getting-started-with-salesforce-flow-part-70-creating-custom-record-sharing-logic/

Categories
Developers Salesforce

Comprensión profunda del libro de productos y precios en Salesforce

Hola amigos,

En esta sección, hablaremos de productos y listas de precios.

Objetivo de aprendizaje:

  • ¿Qué es producto?
  • Venta basada en productos y servicios
  • Diferencia entre producto y activo
  • Crear libro de precios: estándar y personalizado
  • Crear producto
  • Relación entre producto, libro de precios, entrada del libro de precios
  • Ajuste OWD del libro de precios
  • Programación: programa de ingresos y programa de oportunidades
  • Bono: preguntas de la entrevista sobre el producto y la lista de precios

Consejo del día

Cuando esté aprendiendo cualquier concepto en Salesforce, intente aplicarlo a escenarios del mundo real. Esto ayudará a ampliar su comprensión de por qué estamos utilizando un objeto o relación en particular en Salesforce.

¿Qué es el producto?

Es un artículo, paquete o servicio ofrecido al cliente por un precio. Una definición útil para un producto sería:

Cualquier cosa que venda una empresa que resuelva un problema de mercado o aborde la necesidad o el deseo de un cliente.

Venta basada en productos

Artículo : ofrece un solo artículo al cliente. Por ejemplo, zapatos, helados, etc.

Paquete : empaque varios productos juntos y véndalos al cliente

El ejemplo perfecto es la celebración de Cadbury

Venta basada en servicios

Al vender un servicio, es importante destacar qué hace que el servicio sea personal y cómo podemos satisfacer las necesidades de los clientes. Los servicios de marketing requieren establecer relaciones de confianza con los clientes y personalizarlos según sea necesario. Generalmente, las empresas de servicios son menos costosas de operar que las empresas de productos porque no hay inventario y la ubicación física de una empresa basada en servicios a menudo es irrelevante.

Ejemplo: Urban Clap vuelve a casa y ofrece variedad de servicios.

Mejores salones cerca de mí - UrbanCompany

¿Diferencia entre producto y activo?

El producto es invención de la empresa. A través del producto, la empresa genera ingresos. El producto no tendrá valor de depreciación para la empresa.

El activo no está etiquetado para su venta, sino para uso propio de la empresa. Por ejemplo, la empresa de acondicionadores de aire tiene dentro de la oficina un activo. Puede tener valor de depreciación.

Tiempo para manos a la obra

Vaya a App Builder 🡪 Ventas 🡪 Seleccione la flecha desplegable -> Haga clic en Editar

Vaya a Elementos de navegación -> Agregar producto y lista de precios a los elementos seleccionados 🡪 Haga clic en Guardar

Ahora creemos un producto.

¿Cuáles son los diferentes tipos de campos de productos estándar en Salesforce?

Nombre del producto : El nombre del producto debe especificarse de forma clara y familiar.

Código de producto : el código de producto es un código interno o identificación de producto que se utiliza para identificar un producto.

Descripción del producto : Tenemos que ingresar texto en el área de descripción del producto para distinguir los productos entre sí.

Familia de productos : Familia de productos significa que es la categoría del producto. Al establecer la familia de productos en Salesforce, el producto se asigna automáticamente a su familia de productos.

Confundido ???????

Entendamos con la ayuda del ejemplo en tiempo real. Si va al sitio web de Amazon, verá diferentes categorías como libros, belleza, electrodomésticos, etc.

Ahora, si selecciona la categoría Belleza, podrá ver diferentes productos relacionados con la belleza como rímel, desmaquillador, brillo de labios, etc.

Ahora creemos esto en Salesforce.

Vaya a Configuración -> Administrador de objetos -> Producto -> Campos y relación -> Familia de productos

La familia de productos es un campo de lista de selección. En eso, puede agregar valores de lista de selección basados en diferentes categorías. Luego, más tarde, puede asociar un producto en particular a esa familia de productos.

Calendario

Existe una función llamada Programaciones que las empresas pueden utilizar para definir los ciclos de entrega y los pagos de los productos. Las empresas que ofrecen servicios de suscripción y envío de productos suelen utilizar esta función.

Los horarios vienen en dos tipos:

  • Programa de cantidad : determina cuándo se entrega un producto
  • Programa de ingresos : determina cuándo se paga un producto.

¿Cuándo utilizar las tablas de cantidades?

Tomemos, por ejemplo, la suscripción a una revista. Facturan a los suscriptores anualmente y entregan los productos mensualmente. Pueden usar programas de cantidad para ayudar a monitorear las unidades de producto que deben enviarse y si hay pagos de suscripción pendientes que deben realizarse.

Haga clic en la casilla de verificación Programación de cantidades habilitada en el registro del producto para habilitar Programación de cantidades.

¿Cuándo utilizar las tablas de ingresos?

Un programa de ingresos es adecuado cuando los clientes realizan pagos regulares pero reciben el producto una vez.

Por ejemplo, el cliente alquila un automóvil, podría ganar $ 400 por mes durante 48 meses, es decir, $ 19200 en total. Por lo tanto, el cliente ha firmado un contrato por $ 19200 pero mensualmente paga $ 400, es decir, tiene el producto, en este caso el automóvil, pero realiza pagos de manera regular.

Vaya a Configuración -> Configuración de programaciones de productos -> Programaciones de configuración

Vaya a Producto -> Diseño de página -> Agregar sección "Programación" y agregue los siguientes campos al diseño de página

Crear producto

Si está programando el producto, complete los detalles a continuación

Pero cada producto debe tener un precio para poder venderlo en el mercado.

¿Cómo definimos el precio?

Gestionamos el precio del producto utilizando la lista de precios. Hay dos tipos de listas de precios:

  • Libro de precios estándar
  • Libro de precios personalizado

Libro de precios estándar

Cada producto que creamos, deberíamos tener un precio estándar.

Es el precio predeterminado que está asociado.

Vaya al objeto del libro de precios -> haga clic en Nuevo y cree el libro de precios estándar

Seleccione la casilla de verificación además de Libro de precios estándar y Activo

Vaya a Relacionados -> En la lista de precios -> Seleccione Agregar precio estándar

Entonces, hemos creado nuestro producto y hemos establecido el precio estándar.

Libros de precios personalizados

Cuando ofrecemos nuestros productos a diferentes personas con diferentes precios, optamos por libros de precios personalizados.

Por ejemplo, vendo iPhone en India y EE. UU. El precio será diferente para el iPhone en el mercado de India y EE. UU. Entonces, surge el concepto de libro de precios personalizado.

Vaya a la lista de precios -> Haga clic en Nuevo -> Crear la lista de precios

Vaya a Producto -> Relacionado -> Haga clic en Agregar a lista de precios

Agregue el precio de lista de $ 30 para EE. UU. Y $ 25 para India

Entonces ahora tengo diferentes precios para diferentes países.

Implementar varias opciones de precios

Por lo tanto, al utilizar las listas de precios de Salesforce, las empresas pueden especificar diferentes opciones de precios para productos y servicios:

  • Precios estándar: precios predeterminados que las empresas establecen para los productos cuando completan una lista de precios estándar.
  • Precios de lista: Precios incluidos en los libros de precios personalizados.
  • Precio de venta: precio de ciertos productos especificado por un representante de ventas para una oportunidad en particular.

Relación entre el producto, la lista de precios y la entrada de la lista de precios

  • Los productos están representados por: Producto2
  • Las listas de precios están representadas por: Pricebook2
  • Cada una de las entradas de la lista de precios se almacena en– PricebookEntry .

PricebookEntry es el objeto de unión entre Product y Price Book . Cada entrada de la lista de precios tendrá el producto y la identificación de la lista de precios. Así es como funciona la relación.

El objeto Price Books tiene tres registros. Estas son entradas del libro de precios

Por tanto, este objeto de entrada de la lista de precios es el objeto de relación entre los productos y las listas de precios.

Configuración de OWD para objeto de lista de precios

Si vamos a la configuración de uso compartido, ve a la lista de precios y veremos que, por defecto, la configuración está configurada en Usar

ingrese la descripción de la imagen aquí

Sección Q / A

¿Cómo utilizar las listas de precios para vender productos en varias monedas?

Si una empresa tiene un precio único para un producto independientemente de la moneda, puede habilitar la función de monedas múltiples en Salesforce. Luego, las tasas de conversión ingresadas en Salesforce se aplicarán automáticamente a los precios de los productos agregados a una Oportunidad.

escenario 1

Si una empresa establece la moneda de la Oportunidad en USD y agrega un producto con un precio en Rs, el precio se convertirá automáticamente a USD según los tipos de cambio de entrada.

Escenario 2

Si una empresa no desea ajustarse a las tasas de conversión, puede crear una única lista de precios y establecer precios individuales para los productos en cada moneda (por ejemplo, Producto A – USD 100, Producto A – Rs 8000).

¿Podemos eliminar el libro de precios estándar?

Una empresa puede desactivar el Libro de precios estándar, pero no eliminarlo ni archivarlo. En caso de que una empresa cambie los precios en el Libro de precios estándar, puede afectar las oportunidades abiertas e incluso cerradas.

¿Podemos eliminar el libro de precios personalizado en Salesforce?

No es posible eliminar el Libro de precios mientras está en uso en Oportunidades o Cotizaciones.

¿Qué son los medios para archivar una lista de precios?

Si una empresa decide que no necesitará una determinada lista de precios en el futuro, puede archivar una lista de precios incluso si se utiliza en oportunidades o cotizaciones. Una vez archivados los libros de precios, no se pueden recuperar.

¿Cómo podemos determinar qué listas de precios se asignan a un usuario?

De forma predeterminada, la configuración predeterminada de toda la organización para la lista de precios es "Usar". Esto significa que cualquier usuario con acceso de lectura tanto al objeto "Producto" como al "Libro de precios" podrá seleccionar cualquier libro de precios activo.

¿Cómo controlar el acceso a las listas de precios de Salesforce?

Una empresa puede controlar el acceso a las listas de precios estableciendo la regla de uso compartido de toda la organización en las listas de precios en "Solo ver" o "Sin acceso" y luego otorgando acceso a una lista de precios en particular según el rol, grupo público.

¿Cómo establecer el nivel de acceso del producto?

El objeto de productos no utiliza el modelo estándar de uso compartido de registros. El acceso para manipular productos está controlado por la seguridad a nivel de objeto (perfiles y conjuntos de permisos).

¿Cómo modificar los precios en las listas de precios?

El usuario puede modificar los precios en las listas de precios estándar y personalizadas. Esto puede lograrse de dos formas:

  • A mano
  • Uso del cargador de datos de Apex

Espero que hayas disfrutado el artículo. Para obtener más contenido como este, suscríbase al blog y al canal de Youtube Sfdcamplified

Referencias

Lista de productos y precios

Programación de productos

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/09/product-and-price-book.html#utm_source=rss&utm_medium=rss&utm_campaign=product-and-price-book

Categories
Developers Salesforce

Configuración de Enterprise Territory Management en Salesforce

Una imagen que contiene el diagrama Descripción generada automáticamente

Hola amigos, En el último capítulo aprendimos sobre los conceptos de gestión de territorios empresariales. Ahora en este artículo lo configuraremos.

Paso 1: habilitar la gestión del territorio empresarial

Paso 2: construir modelo de territorio

  1. Tipos de territorio
  2. Prioridad territorial
  3. Modelo de territorio

Paso 3: crear jerarquía de territorios

Paso 4: Asignar cuenta a territorios

  • Asignación automática
  • Asignación manual

Paso 5: Asignar usos al territorio

Paso 6: activar el modelo de territorio

Paso 1: habilitar la gestión del territorio empresarial

Habilitar la gestión de territorio empresarial

Haga clic en Configuración -> Configuración de territorios, y luego haga clic en el botón Habilitar administración de territorio empresarial

El territorio es un grupo de cuentas y usuarios. Entonces, los usuarios en el territorio tendrán al menos acceso de lectura a las cuentas. Los territorios también proporcionarán acceso a los objetos estándar que están relacionados con las cuentas en una relación de detalle maestro. Entonces, esa es la razón por la que tenemos oportunidades, pero no líderes en entornos territoriales.

Los usuarios en el territorio tendrán automáticamente al menos acceso de lectura a la cuenta y también acceso a las oportunidades y casos relacionados. Aquí definimos el nivel de acceso predeterminado. Sin embargo, esto no se aplica a todos los territorios porque podemos establecer el nivel de acceso por separado para diferentes territorios.

Tenga en cuenta que no hay ninguna opción para dar "no acceso" a la cuenta. Pero para oportunidades y casos, tenemos la opción "sin acceso". Esa opción no está en la cuenta porque los usuarios tendrán al menos acceso de lectura a todas las cuentas.

Asignación de territorio de oportunidad

La función de asignación de territorio de oportunidad se usa para asignar oportunidades a territorios y para esta clase de ápice se usa. Para habilitar esta característica, necesitamos crear la clase de ápice con la lógica y luego asignar esa clase de ápice y habilitar la característica.

Paso 2: construir modelo de territorio

El modelo de territorio organiza los elementos de la gestión del territorio de la organización en un solo lugar. Compromete la jerarquía territorial, las reglas de asignación de cuentas, las asignaciones de usuarios, todo en un solo lugar.

  1. Tipos de territorio
  2. Prioridad territorial
  3. Modelo de territorio

Primero, creemos tipos de territorio. El tipo de territorio depende de los requisitos comerciales. Podemos tener cuentas directas o cuentas de socios o cuentas de clientes o basadas en ventas, como cuentas de alta venta.

Aquí, he creado una cuenta de socio y una cuenta de cliente

Prioridad territorial

Está definiendo la prioridad de ese territorio. Allí, no hay una especificación predefinida de cómo debería ser la prioridad. Así que le he dado prioridad a la cuenta de socio, prioridad 100 y a la cuenta de cliente, prioridad 101.

Modelo de territorio

Ahora sigamos adelante y creemos un modelo de territorio. El modelo de territorio agrupa todos los componentes dentro de ese.

He añadido el nombre de la empresa en el modelo Territorio.

Hay tres estados en nuestro modelo de territorio:

  • Planificación
  • Activo
  • Archivado

Siempre que creamos un modelo de territorio, automáticamente cae en el estado de planificación y una vez que completamos toda la configuración, finalmente lo activamos. Solo un modelo de territorio puede estar en estado activo.

Si hace clic en Ver jerarquía, podrá ver la estructura vacía.

Acabamos de crear el modelo. No hemos creado territorios ni reglas. Acabamos de crear esa estructura externa y todavía tenemos que crear todos nuestros componentes dentro de ella.

Paso 3: crear jerarquía de territorios

Ahora vamos a crear territorios y luego crearemos la jerarquía de territorios.

Vaya al modelo de territorio -> Haga clic en Etiqueta (Verizon) -> Ver jerarquía -> Haga clic en Crear territorio

Cada empresa tiene sus propios criterios en los que su territorio se define como por ubicación, por industria u otros campos personalizados. Aquí, ya hemos creado un modelo llamado "Verizon". Ahora, estamos creando territorios dentro de eso, como el este de EE. UU., El oeste de EE. UU., El centro de EE. UU.

El tipo de territorio es un campo obligatorio para crear un territorio que ya hemos creado en la sección anterior.

Además, mientras configuramos inicialmente la función de administración de territorio empresarial, configuramos los niveles de acceso predeterminados. Sin embargo, en cada territorio podremos configurar los niveles de acceso.

He añadido Territorio central, oriental y occidental de EE. UU.

En el territorio occidental de EE. UU., He agregado territorios secundarios, es decir, California y Seattle. California y Seattle son territorios hermanos, ya que están al mismo nivel.

Paso 4: Asignar cuenta a territorios

Podemos asignar cuentas a territorios de dos formas:

  • Asignación automática
  • Asignación manual

Asignación automática

Asigna automáticamente las cuentas a territorios según ciertos criterios.

Para la asignación automática, crearemos reglas. Y las reglas definirán los criterios a través de los cuales las cuentas se asignarán a los territorios, y cada vez que se cree o edite la cuenta, esta regla se evaluará y, en base a eso, la cuenta se asignará a ese territorio en particular. Eso se llama asignación automática.

Haga clic en el territorio en el que desea asignar la cuenta -> Además de "Reglas de asignación asignadas a este territorio", haga clic en el botón "Nuevo"

Agregue la lógica por la que desea asignar la cuenta a ese territorio. Agregué que si Cuenta: Estado de facturación es igual a California, agregue a Territorio de California.

La creación de una regla no hará que suceda la asignación, necesitamos ejecutar las reglas. Haga clic en "Ejecutar reglas" al lado del territorio.

Asignación manual

La asignación manual consiste en asignar manualmente una cuenta a un territorio.

Haga clic en Agregar cuentas

Seleccione la casilla de verificación junto a la cuenta que desea asignar y haga clic en asignar

Podemos asignar una sola cuenta a múltiples territorios o podemos asignar múltiples cuentas a un solo territorio.

Paso 5: Asignar usos al territorio

Los usuarios tendrán acceso a las cuentas para vender sus productos y servicios.

Haga clic en "Administrar usuarios" y asigne todos los usuarios apropiados al territorio en particular.

Paso 6: activar el modelo de territorio

El último paso es activar nuestro modelo de territorio.

Filtro de asignación de territorio de oportunidad

Si queremos asignar oportunidades a territorios, solo entonces debemos implementar con este paso. Para la asignación de oportunidades, la lógica se da en la clase vértice, lo que nos ayudará a asignar las oportunidades a los territorios.

Salesforce ha proporcionado una clase de ápice de ejemplo para implementar en su documento. Podemos agregar la clase

Implementación de ejemplo de OpportunityTerritory2AssignmentFilter

La página Configuración de territorio con asignación de territorio de oportunidad basada en filtros habilitada

Excluir manualmente una oportunidad de la asignación de territorio basada en filtros

Podemos excluir una oportunidad específica de la asignación de territorio basada en filtros.

Para ello, debemos seleccionar una casilla de verificación en el registro de oportunidades. "Excluir de la lógica del filtro de asignación de territorio". Al seleccionar este campo, podemos excluir el registro de oportunidad de la asignación de territorio.

Espero que este artículo le haya ayudado a aclarar sus dudas con respecto a la configuración del territorio en Salesforce. Suscríbase al blog y al canal de YouTube sfdcamplified para obtener más material como este.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/09/setup-enterprise-territory-management.html#utm_source=rss&utm_medium=rss&utm_campaign=setup-enterprise-territory-management

Categories
Developers

Introducción a Salesforce Flow – Parte 67 (¡Hurra! ¡Analizar una lista de selección múltiple ya no es un problema! ¡Uf!)

Gran idea o pregunta duradera:

Proporcione un asistente que le permita a su equipo de ventas internas y a los telemarketers agregar clientes potenciales a varias campañas.

Hace 6 años escribí un artículo ( Agregar registro a varios grupos de Chatter – Análisis de campos de lista de selección de selección múltiple ) para analizar la lista de selección de selección múltiple o el grupo de casillas de verificación en Salesforce Flow . No es sorprendente que este haya sido uno de los blogs más leídos en Automation Champion , ¡por buenas razones!

A menudo, los lectores de mi blog preguntan: ¿existe una forma más fácil y rápida de analizar la lista de selección de selección múltiple en Flow sin Apex ? En su pregunta, casi podía 'escuchar' a mis lectores regañarme: '¿no puede encontrar una forma mejor, más fácil y más rápida de analizar la lista de selección de selección múltiple en Flow sin Apex? 🤔 ¡Bueno, no podría decepcionar más! ¡Así que ahí voy!

Pero, antes de continuar, dediquemos unos minutos a comprender qué se necesita para analizar la lista de selección múltiple o el grupo de casillas de verificación.

La respuesta es muy simple, si selecciona tres campañas (como se muestra en la captura de pantalla anterior) Salesforce guardará los identificadores de registro en un formato separado por comas, NO en una variable de colección. Aplicable tanto para el grupo de casillas de verificación como para la lista de selección múltiple.

701B0000000UKG1; 701B0000000HRFi; 701B0000000UKG1

Ahora, si desea utilizar una campaña específica en un flujo, su única opción es analizar los ID. No se preocupe, el análisis es muy fácil y rápido. ¡Te prometo que tomará menos tiempo que cocinar fideos!

Objetivos:

Esta publicación de blog nos ayudará a comprender lo siguiente:

  • Cómo analizar una lista de selección múltiple
  • Cómo analizar un grupo de casillas de verificación
  • Cómo utilizar una fórmula en Salesforce Flow para optimizarla
  • Cómo ejecutar un elemento de decisión varias veces
  • Y, por último, pero no menos importante, descubra cómo utilizar el elemento Crear registros para crear varios registros (agregar miembros de la campaña) todos a la vez (Bulk Safe) – (hmmm … ¡tantos, cómo! )

Brenda David trabaja como administradora de sistemas en Universal Containers (UC). Como parte del proceso de optimización de clientes potenciales, recibió los siguientes requisitos de su director de ventas, Chris Mattison. Su conversación fue la siguiente:

  • Brenda, la semana pasada me reuní con algunos vendedores por teléfono en nuestra oficina de Dallas. Uno de los problemas habituales planteados por los telemarketers era que cada vez que llamaban a un prospecto / prospecto se encontraban con que el prospecto / prospecto estaba influenciado por muchas de nuestras campañas. Como resultado, para mantener mejor la atribución, los vendedores por teléfono agregaron manualmente el prospecto / cliente potencial a varias campañas en función de su conversación con los clientes potenciales / clientes potenciales.
  • ¡Necesito su ayuda para facilitarles la vida a los vendedores por teléfono! ¿Es posible crear una pantalla que los vendedores telefónicos puedan lanzar desde un registro de clientes potenciales y seleccionar varias campañas? Una vez hecho esto, los vendedores por teléfono deberían poder agregar a los clientes potenciales a la campaña como miembros.

Enfoque de campeón de automatización (I-do):

Hay algunas soluciones posibles para el escenario empresarial anterior, pero usaré Screen Flow para resolver el requisito empresarial. La razón principal para seleccionar el flujo de pantalla es que queremos permitir que los usuarios proporcionen una entrada.

Antes de continuar, tomemos unos minutos para comprender el objeto CampaignMember en Salesforce . El objeto representa la asociación entre una campaña y (1) un cliente potencial o (2) un contacto.
Nombre del campo Detalles
CampaignId El ID de la campaña a la que está asociado este cliente potencial o contacto.
LeadId El ID del cliente potencial asociado con una campaña.

En segundo lugar, entendamos la
fórmula MID. La fórmula devuelve un número específico de caracteres desde el medio de una cadena de texto dada la posición inicial.

Antes de discutir la solución, permítame mostrarle un diagrama de un flujo de proceso a un alto nivel. Por favor, dedique unos minutos a revisar el siguiente diagrama de flujo y entiéndalo.

Comencemos a construir este proceso de automatización.

Práctica guiada (lo hacemos):

Hay 2 pasos para resolver los requisitos comerciales de Brenda mediante Screen Flow . Debemos:
  1. Pasos de flujo de Salesforce: definir propiedades de flujo
    1. Cree una variable de texto para almacenar los ID de campaña seleccionados
    2. Agregue una pantalla para capturar la entrada del usuario
      1. Agregue un componente de lista de selección múltiple para mostrar campañas activas
    3. Agregar un elemento de asignación para agregar el ID de campaña seleccionado en una variable de texto
    4. Cree una variable de texto para almacenar el número de inicio
    5. Agregue un recurso de fórmula para obtener una campaña a la vez a partir de los ID de las campañas seleccionadas
    6. Agregue un elemento de decisión para verificar si la fórmula devuelve un ID de registro
    7. Agregue un elemento de asignación para completar la variable de registro de miembros de la campaña
    8. Agregue un elemento de asignación para agregar una variable de registro de miembro de la campaña en una variable de colección de registros
      1. Aumentar el número de inicio en 20
        1. ¡Espera un minuto! tal vez se pregunte: ¿por qué debería aumentar el número de inicio en 20? ¿No estamos utilizando un Id. De Salesforce de 18 dígitos?
        2. Mi respuesta – ¡¡Gran pregunta !! ¡Esté siempre atento al leer cualquier blog! ¡Cuestionar todo! ¡Pregunte por qué !
          1. Bien, aquí hay una explicación de por qué necesitamos aumentar el número de inicio en 20 … un ID de registro es de 18 dígitos, cierto. Dado que estamos usando múltiples identificadores, necesitamos separar los identificadores usando un ';'. Entonces, necesitamos agregar un espacio para el ';'. En segundo lugar, ¡también necesitamos agregar un dígito para un espacio en la fórmula!
    9. Agregue un elemento Crear registros para agregar registros de miembros de la campaña
  2. Cree una acción rápida para iniciar el flujo

Paso 1: Flujo de Salesforce: definir propiedades de flujo

  1. Haga clic en Configuración .
  2. En el cuadro Búsqueda rápida, escriba Flujos .
  3. Seleccione Flujos y luego haga clic en Nuevo flujo .
  4. Seleccione el flujo de pantalla   y haga clic en Siguiente y configure el flujo de la siguiente manera:
    1. ¿Cómo quieres empezar a construir ? Freeform
  5. Se le abrirá el diseñador de flujo.

Paso 1.1: Flujo de Salesforce: cree una variable de texto para almacenar los ID de campaña seleccionados

  1. En Caja de herramientas , seleccione Administrador, luego haga clic en Nuevo recurso para almacenar los ID de campaña seleccionados
  2. Ingrese la siguiente información:
    1. Tipo de recurso : variable
    2. Nombre de API : varTSelectedCampaignId
    3. Tipo de datos : texto
    4. Valor predeterminado: {! $ GlobalConstant.EmptyString}
    5. Verificar disponible para entrada
    6. Verificar disponible para salida
  3. Haz clic en Listo .

Paso 1.2: Flujo de Salesforce: agregar un elemento de pantalla

  1. En Caja de herramientas , seleccione Elementos . Arrastra y suelta la pantalla en el lienzo.
  2. Ingrese la siguiente información :
    1. Ingrese la etiqueta, el nombre de la API se completará automáticamente.
  3. Haz clic en Listo .

Paso 1.2.1: Flujo de Salesforce: agregue un componente de lista de selección múltiple para mostrar campañas activas

  1. En la sección Entrada en Elemento de pantalla . Arrastre y suelte el componente Lista de selección de selección múltiple en la pantalla.
  2. Ingrese la siguiente información :
    1. Ingrese un nombre en el campo Etiqueta; el nombre de la API se completará automáticamente.
    2. Seleccionar casilla de verificación
    3. Bajo elección
      1. Haga clic en + Nuevo recurso , se abrirá una ventana emergente para usted
      2. Tipo de recurso : conjunto de opciones de registro
      3. Nombre de API : recChoiceCampaigns
      4. Objeto : Campaña
      5. Filtrar registros de campaña
        1. Fila 1:
          1. Campo: IsActive
          2. Operador : Igual que
          3. Valor: {! $ GlobalConstant.True}
      6. Configure cada opción
        1. Etiqueta de elección : Nombre
        2. Tipo de datos : texto
        3. Valor de elección : Id
      7. Haga clic en Listo
  3. Haz clic en Listo .

Paso 1.3: Flujo de Salesforce: agregar un elemento de asignación para agregar identificadores de campaña seleccionados en una variable de texto

  1. Ingrese un nombre en el campo Etiqueta (completar variable con ID de campaña ) ; el nombre de la API se completará automáticamente.
  2. Establecer valores variables
    1. Fila 1:
      1. Campo: {! VarSelectedCampaignId}
      2. Operador: Agregar
      3. Valor: {! Select_Campaigns}
  3. Haz clic en Listo .

Paso 1.4: Flujo de Salesforce: cree una variable de texto para almacenar el número de inicio

  1. En Caja de herramientas , seleccione Administrador, luego haga clic en Nuevo recurso para almacenar el número de inicio
  2. Ingrese la siguiente información:
    1. Tipo de recurso : variable
    2. Nombre de API : varStartNumber
    3. Tipo de datos : Número
    4. Valor decimal : 0
    5. Valor predeterminado: 1
    6. Verificar disponible para entrada
    7. Verificar disponible para salida
  3. Haz clic en Listo .

Paso 1.5: Flujo de Salesforce: agregue una fórmula para obtener un ID de campaña a la vez a partir de los ID de campañas seleccionadas

  1. En Caja de herramientas , seleccione Administrador , luego haga clic en Nuevo recurso para crear una fórmula para devolver un ID de campaña
  2. Ingrese la siguiente información :
    1. Tipo de recurso : Fórmula
    2. Nombre de API : for18DigitCampaignId
    3. Tipo de datos : texto
    4. Fórmula : MID ({! VarSelectedCampaignId}, {! VarStartNumber}, 18)
  3. Haz clic en Listo .

Paso 1.6: Flujo de Salesforce: uso del elemento de decisión para verificar si la fórmula tiene devuelve un RecordId

Ahora usaremos un elemento Decisión para verificar si la fórmula ha devuelto un recordId. La siguiente captura de pantalla debería ayudarlo a configurar el elemento Decisión.

  1. En Caja de herramientas , seleccione Elemento .
  2. Arrastre y suelte el elemento Decisión en el diseñador de flujo.
  3. Ingrese un nombre en el campo Etiqueta (RecordId devuelto) ; el nombre de la API se completará automáticamente.
  4. En Detalles del resultado ,   ingrese la Etiqueta (Iniciar bucle), el Nombre de la API se completará automáticamente.
  5. Requisitos de condición para ejecutar el resultado : se cumplen todas las condiciones (Y)
    1. Fila 1:
      1. Recurso: {! $ For18DigitCampaignId}
      2. Operador: es nulo
      3. Valor: {! $ GlobalConstant.False}
  6. Haz clic en Listo .

Paso 1.7: Flujo de Salesforce: agregue un elemento de asignación para completar la variable Registro de miembros de la campaña

  1. Crear una variable de registro varRCampaignMember   de tipo Miembro de campaña para agregar un miembro de campaña a un cliente potencial.
  2. Agregue una variable de texto para pasar la identificación del registro del cliente potencial actual.
  3. Arrastre y suelte el elemento Asignación en el diseñador de flujo.
  4. Ingrese un nombre en la etiqueta ( campo de suscripción de entidad de construcción ; el nombre de la API se completará automáticamente.
  5. Establecer valores variables
    1. Fila 1:
      1. Campo: {! VarREntitySubscription.ParentId}
      2. Operador: Igual que
      3. Valor: {! $ Record.Id}
    2. Haga clic en Agregar asignación
    3. Fila 2:
      1. Campo: {! VarREntitySubscription.SubscriberId}
      2. Operador: Igual que
      3. Valor: {! Loop_through_Preferences.Follower_Name__c}
  6. Haz clic en Listo .

Paso 1.8: Flujo de Salesforce: agregar una variable de registro de miembro de campaña a una variable de colección de registros y aumentar el número de inicio en 20

  1. Cree una variable de colección de registros varRCampaignMember de tipo Campaign Member para almacenar la variable de registro (creada en el paso 1.7) para el proceso masivo.
  2. Arrastre y suelte el elemento Asignación en el diseñador de flujo.
  3. Ingrese un nombre en el campo Etiqueta ( Aumentar la variable de inicio y la agrupación ) ; el nombre de la API se completará automáticamente.
  4. Establecer valores variables
    1. Fila 1:
      1. Campo: {! VarRCampaignMembers}
      2. Operador: Agregar
      3. Valor: {! VarRCampaignMember}
    2. Haga clic en Agregar asignación
    3. Fila 2:
      1. Campo: {! VarStartNumber}
      2. Operador: Agregar
      3. Valor: 20
  5. Haz clic en Listo .

Paso 1.9: Flujo de Salesforce: agregar un elemento Crear registros para agregar registros de miembros de la campaña

  1. Arrastre y suelte el elemento Crear registros en el diseñador de flujo.
  2. Ingrese un nombre en el campo Etiqueta ( Agregar miembros de la campaña ); el nombre de la API se completará automáticamente.
  3. Para ¿Cuántos registros crear? Seleccione Varios.
  4. Colección de registros de mapas : {! VarRCampaignMembers}
  5. Haz clic en Listo .

Al final, Brenda's Flow se verá como la siguiente captura de pantalla:

  1. Haga clic en Guardar .
  2. Ingrese la etiqueta de flujo, el nombre de la API se completará automáticamente.
  3. Haga clic en Mostrar avanzado .
  4. Cómo ejecutar el flujo : versión de API para ejecutar el flujo: 52
  5. Versión de API para ejecutar el flujo : 52
  6. Etiqueta de la entrevista : Activada por registro después de guardar: Analizar lista de selección de selección múltiple {! $ Flow.CurrentDateTime}
  7. Haga clic en Guardar .


¡Casi ahí! Una vez que todo se vea bien, haga clic en el botón Activar.

Paso 2: cree una acción rápida para iniciar el flujo

El siguiente paso es crear una acción rápida ( Agregar a campañas ) en el objeto Cliente potencial para iniciar el Flujo. Salesforce pasará automáticamente el Id . De cliente potencial a la variable recordId.

  1. Haga clic en Configuración .
  2. En el Administrador de objetos, escriba Grupo .
  3. Seleccione Botones, Vínculos y Acción , luego haga clic en Nueva acción .
  4. Ingrese la siguiente información :
    1. Seleccione Flujo como tipo de acción .
    2. Seleccione Analizar lista de selección múltiple como flujo .
    3. Ingrese la etiqueta (Agregar a campañas), el nombre se completará automáticamente.
  5. Haga clic en Guardar.

Asegúrese de agregar la acción rápida a las páginas de registro Lightning.

Prueba de concepto

En el futuro, cualquiera puede usar esta aplicación para agregar un cliente potencial a varias campañas.

  1. Para agregar un cliente potencial a varias campañas , haga clic en la acción rápida y siga las instrucciones en la pantalla como se muestra en el video:

Evaluación formativa:

¡Quiero saber de ti!

¿Qué aprendió de esta publicación, es relevante para usted y cómo modificará los conceptos enseñados en la publicación para sus propios procesos comerciales?

Haz una publicación y etiquétame en Twitter @automationchamp usando #AutomationChampionFlow.

 Corrector de pruebas : - Munira Majmundar

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2021/07/27/getting-started-with-salesforce-flow-part-67-hurray-parsing-a-multi-select-picklist-is-trouble-no-more-phew/

Categories
Developers Tutoriales de Salesforce

Seguridad para desarrolladores de Salesforce ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

En Salesforce, la confianza es nuestro valor número uno. Cuando cree aplicaciones en la plataforma Salesforce, tenga la seguridad de que residen en un entorno seguro.

Implementamos las mejores prácticas y estándares de seguridad de la industria en todas las capas, desde la infraestructura hasta el código de la aplicación. Brindamos múltiples opciones de configuración que le permiten implementar un modelo de seguridad de datos efectivo, de modo que los datos sean accesibles solo por usuarios autorizados.También brindamos protecciones integradas para vulnerabilidades de seguridad de aplicaciones comunes, como Cross-Site Scripting, inyección SOQL o Cross -Falsificación de solicitud de sitio. Además de todo eso, le brindamos herramientas para proteger el almacenamiento y la transmisión de secretos que puede utilizar para proteger aún más sus aplicaciones.

Sin embargo, como desarrollador de Salesforce, existen ciertos conceptos y mejores prácticas que debe conocer para evitar la filtración de datos o la creación de vulnerabilidades de seguridad de aplicaciones peligrosas. En esta publicación de blog, le brindaremos una descripción general rápida de las mejores prácticas de seguridad que debe seguir al codificar con Apex y con LWC (Nota: Visualforce y Aura están fuera del alcance de esta publicación de blog).

Hacer cumplir la seguridad de los datos para proteger sus registros

Primero, hablemos de la seguridad de los datos. La seguridad de los datos evita el acceso no autorizado. Es decir, asegura que cada usuario tenga acceso solo a los datos a los que debería tener acceso. En Salesforce, esto se implementa a través de tres capas diferentes: seguridad a nivel de objeto (también conocida como CRUD: Crear, Leer, Actualizar, Eliminar), seguridad a nivel de campo (FLS) y seguridad a nivel de registro (también conocida como Compartir).

Me gusta explicar estas tres capas con la siguiente imagen, en la que imaginamos una base de datos como si fuera una hoja de cálculo. Básicamente, cada capa controla la visibilidad de una tabla (pestaña), columna o registro en la base de datos.

Estas capas de seguridad se configuran a través de varias herramientas, como conjuntos de permisos, valores predeterminados de toda la organización o reglas de uso compartido. Si es un desarrollador en solitario o alguien de un equipo pequeño, puede configurarlos usted mismo. Pero si estás en un equipo más grande, es probable que no lo hagas. Sin embargo, en ambos casos, probablemente escribirá código. Por lo tanto, es extremadamente importante que comprenda cómo se ejecuta el código de la aplicación en lo que respecta a la seguridad de los datos y cómo hacer cumplir los diferentes mecanismos de seguridad de los datos cuando no se aplican de forma predeterminada.

Básicamente, las operaciones en Salesforce se pueden ejecutar en dos modos: modo de usuario, donde se aplica la seguridad de los datos, y modo del sistema, donde no lo está. Las operaciones a través de puntos de entrada como la interfaz de usuario estándar (páginas de registro de Salesforce estándar) y los puntos finales de API estándar se ejecutan en modo de usuario. Los componentes y servicios que se utilizan para crear interfaces de usuario también se ejecutan en modo de usuario. Estos pueden ser componentes Lightning en forma de registro o puntos finales LDS (Lightning Data Service).

Sin embargo, Apex fue diseñado para implementar la lógica empresarial. Muchas veces, los procesos comerciales necesitan acceso a todos los datos, independientemente del usuario que está ejecutando el proceso. Es por eso que decidimos hacer que Apex se ejecute en modo de sistema de forma predeterminada. Esto le brinda flexibilidad, pero al mismo tiempo, debe implementar controles de seguridad de datos cuando el proceso no requiere esos privilegios de datos.

Los puntos de entrada resaltados en la imagen son solo una parte. Puede encontrar una lista más exhaustiva en esta publicación de Stackexchange .

Para hacer cumplir la seguridad de los datos en Apex , deberá verificar los permisos de objetos, campos y niveles de registro cuando:

  • Crea, actualiza o elimina registros con operaciones DML
  • Lees registros con SOQL o SOSL

Hay diferentes formas en las que puede verificar la seguridad a nivel de campo y de objeto en Apex:

  • Usando la WITH SECURITY_ENFORCED en consultas SOQL. Esta cláusula evita la recuperación de objetos y campos a los que el usuario no tiene acceso, lanzando una excepción en su lugar:
     Public static List <Cuenta> getAccountsWithSecurityEnforcement () {
    regreso [
    SELECCIONE Nombre, Ingresos anuales, Industria
    De la cuenta
    CON SECURITY_ENFORCED
    ORDEN POR Nombre
    ];
    }
  • Uso de los métodos Schema.DescribeSObjectResult y Schema.DescribeFieldResult. Permiten una gran flexibilidad para ajustar la forma en que su código verifica la seguridad de los datos, pero también requieren más trabajo de su parte como desarrollador y ocupan más líneas de código:
 cuenta estática pública createAccountCRUDCheck () { Cuenta de cuenta; // Solo cheque CRUD if (Schema.sObjectType.Account.isCreateable ()) { acct = nueva cuenta (); acct.Name = 'ACME'; acct.AnnualRevenue = 1000000; insertar cuenta; } demás { lanzar nueva DMLException ('No hay permisos de objeto para crear una cuenta.'); } cuenta de retorno; }
 Lista estática pública <Cuenta> getAccountsFLSCheck () { // Comprobación FLS (comprobación CRUD implícita) Si ( Schema.sObjectType.Account.fields.Name.isAccessible () && Schema.sObjectType.Account.fields.AnnualRevenue.isAccessible () && Schema.sObjectType.Account.fields.Industry.isAccessible () ) { return [SELECCIONAR Nombre, Ingresos anuales, Industria DE la cuenta ORDENAR POR Nombre]; } return new List <Cuenta> (); }
 Lista estática pública <Cuenta> getAccountsStripInaccessible () { SObjectAccessDecision securityDecision = Security.stripInaccessible ( AccessType.READABLE, [SELECCIONAR Nombre, Ingresos anuales, Sector DE la cuenta ORDENAR POR Nombre] ); System.debug (securityDecision.getRecords ()); return securityDecision.getRecords (); }
 cuenta estática pública createAccountStripInaccessible () { Cuenta cuenta = nueva cuenta (); acct.Name = 'ACME'; acct.AnnualRevenue = 1000000; SObjectAccessDecision securityDecision = Security.stripInaccessible ( AccessType.CREATABLE, nueva lista <Cuenta> {cuenta} ); insertar securityDecision.getRecords (); return (Cuenta) securityDecision.getRecords () [0]; }

Hay una cuarta opción, que todavía no está disponible en general, pero en fase piloto, llamada Código Apex seguro con operaciones de base de datos en modo de usuario . Con este piloto, los métodos de la base de datos admitirán un AccessLevel que le permitirá ejecutar operaciones de la base de datos en modo de usuario. ¡Manténganse al tanto!

Bonificación: si desea ver un ejemplo de uso más avanzado de los Schema , eche un vistazo a CanTheUser en Apex Recipes. Esta clase es una biblioteca que expone métodos fáciles de leer para verificar la seguridad a nivel de campo y objeto.

Para aplicar la seguridad a nivel de registro , debe indicar una cláusula de uso compartido en la definición de la clase Apex . Una clase puede ser with sharing (impone permisos de registro), without sharing (omite intencionalmente los permisos de registro) o inherited sharing (hereda el comportamiento de verificación de seguridad de registro del código de llamada).

 público con clase de uso compartido AccountController { // Contenido de la clase
}

No especificar una cláusula de intercambio es siempre una mala práctica. Omitir la cláusula de uso compartido de una clase y usar el uso inherited sharing refuerza el comportamiento de uso compartido de la clase que llama. Sin embargo, si la clase es el punto de entrada a la transacción de Apex, el inherited sharing pasa a ser más seguro with sharing mientras que el caso omitido tiene el valor predeterminado without sharing . Además, si se omite la cláusula de uso compartido, no estará claro si se espera el comportamiento heredado o si el desarrollador simplemente se olvidó de indicarlo.

Como ha visto, las formas de verificar la seguridad a nivel de campo y de objetos son diferentes de cómo verifica la seguridad a nivel de registro. Este es un concepto erróneo común que me encantaría que los lectores recordaran: ¡ configurar una clase como para compartir no impone permisos de seguridad a nivel de campo o de objeto!

Prevención de amenazas con seguridad de aplicaciones

Seguridad de aplicaciones describe las mejores prácticas a seguir al crear aplicaciones para prevenir amenazas y vulnerabilidades comunes. Anualmente, la organización Open World-Wide Application Security Project ( OWASP ) revisa la lista OWASP Top 10. Este es un informe que describe las 10 vulnerabilidades más críticas que están afectando la seguridad de las aplicaciones web. Estas son las vulnerabilidades enumeradas en OWASP Top 10 para 2021:

A1: 2017-Inyección
A2: Autenticación rota en 2017
A3: Exposición de datos sensibles en 2017
A4: Entidades externas XML 2017 (XXE)
A5: 2017-Control de acceso roto
A6: Configuración incorrecta de seguridad en 2017
A7: XSS de secuencias de comandos entre sitios de 2017
A8: Deserialización insegura en 2017
A9: 2017: uso de componentes con vulnerabilidades conocidas
A10: Registro y monitoreo insuficientes en 2017

Afortunadamente, Salesforce cuenta con protecciones predeterminadas para la mayoría de estas vulnerabilidades, como CSP, Locker Service, Shadow DOM y muchas más. Sin embargo, hay algunos casos extremos, en los que un desarrollador puede abrir involuntariamente la puerta a algunos de ellos. Analicemos algunas de estas situaciones:

Inyección SOQL

La inyección de SQL se produce cuando los datos que no son de confianza se interpretan como parte de una consulta SQL. En Salesforce, tenemos nuestro propio lenguaje de consulta, SOQL.SOQL es similar a SQL , pero una de sus principales diferencias es que SOQL no se puede usar para modificar datos, solo para leer. Como consecuencia, SOQL es intrínsecamente más seguro contra los ataques de inyección SOQL , ya que no modificarán la base de datos. Sin embargo, un ataque de inyección SOQL puede revelar datos confidenciales que el desarrollador no esperaba exponer.

El uso de la sintaxis de consulta SOQL estática en Apex mitiga el riesgo de un ataque de inyección SOQL. Los tokens de consultas estáticas se validan en tiempo de compilación y las variables de Apex vinculadas con ":" se tratan como variables en tiempo de ejecución para garantizar que no se conviertan en elementos ejecutables en la consulta.

 Public static List <Cuenta> getFilteredAccountsStatic (String searchValue) { String likeValue = '%' + searchValue + '%'; // CONSULTA SEGURA :) regreso [ SELECCIONE Nombre, Ingresos anuales, Industria De la cuenta DONDE Nombre COMO: likeValue ORDEN POR Nombre ]; }

Sin embargo, si utiliza consultas dinámicas , es posible que se produzca una inyección SOQL. Piense en el siguiente código:

 Public static List <Cuenta> getFilteredAccountsInjection (String searchValue) { String likeValue = ''% '+ searchValue +'% ''; // ¡¡¡NO HAGAS ESTO !!! return (Lista <Cuenta>) Database.query ( 'SELECCIONAR Nombre, Ingresos anuales, Industria DE la cuenta DONDE Nombre LIKE' + likeValue + 'ORDEN POR Nombre' ); }

Si un atacante consigue pasar un valor como %' AND AnnualRevenue >= 2000000 AND Industry LIKE '% , a la searchValue , podrá recuperar todas las cuentas que AnnualRevenue> = 2000000, revelando información privada.

Para prevenir esto:

  • Utilice consultas estáticas cuando sea posible
  • Si usa consultas dinámicas, vincule los datos que no sean de confianza con ":"
 Public static List <Cuenta> getFilteredAccountsBinding (String searchValue) { String likeValue = '%' + searchValue + '%'; return (Lista <Cuenta>) Database.query ( 'SELECCIONAR Nombre, Ingresos Anuales, Industria DE Cuenta DONDE Nombre COMO: likeValue ORDENAR POR Nombre' ); }
  • Si alguna de estas opciones es posible, escape, encasille (encuentre un ejemplo aquí ) o allowlist (para permitir solo valores identificados) los datos no confiables
 Lista estática pública <Cuenta> getFilteredAccountsEscape (String searchValue) { String likeValue = ''% '+ String.escapeSingleQuotes (searchValue) +'% ''; return (Lista <Cuenta>) Database.query ( 'SELECCIONAR Nombre, Ingresos anuales, Industria DE la cuenta DONDE Nombre LIKE' + likeValue + 'ORDEN POR Nombre' ); }

Secuencias de comandos entre sitios (XSS)

Con Cross-Site Scripting (XSS) , los atacantes pueden inyectar scripts maliciosos en el navegador de la víctima. Esto sucede siempre que una aplicación incluye datos que no son de confianza en la salida que genera sin validarlos o codificarlos. XSS puede provocar el secuestro de sesiones, redireccionamientos maliciosos o simplemente desfigurar la aplicación web.

Locker Service y CSP (Content-Security Policy) son nuestras herramientas para luchar contra XSS en Salesforce. Sin embargo, a pesar de que hacen un gran trabajo, existen algunas mejores prácticas de desarrollo que deben seguirse para no disminuir su eficacia:

  • Manténgase alejado de la manipulación DOM ( lwc:dom="manual" ) cuando sea posible, y use directivas de plantilla en su lugar. ¿Por qué? porque cuando dejas que el marco manipule el DOM, Locker Service desinfecta las entradas antes de renderizar el HTML. Mientras que si lo manipula usted mismo, Locker Service no lo hace. Alternativamente, si necesita usar lwc:dom="manual" , desinfecte las entradas usted mismo. Puede hacerlo aplicando filtrado de entrada (por ejemplo, no permitir > ) o codificación de salida (por ejemplo, transformar > a &lt; ).
  • Evite las funciones de JavaScript que evalúan cadenas como código, como Eval , DOMParser.parseFromString , Document.implementation.createHTMLDocument y setTimeout / setInterval (cuando se utilizan para evaluar una cadena).
  • Evalúe adecuadamente las bibliotecas de terceros, ya que también pueden contener vulnerabilidades XSS. Puedes hacerlo manualmente o usando herramientas automáticas, como CheckMarx o Snyk.

Falsificación de solicitud entre sitios (CSRF)

La falsificación de solicitudes entre sitios (CSRF) obliga a un usuario a ejecutar acciones no deseadas en una aplicación web en la que está autenticado. Imagine que el usuario está autenticado con Salesforce. Con CSRF, un atacante malintencionado podría hacer que el usuario elimine cuentas, cambie una cantidad de oportunidad o algo mucho peor. ¡Y es posible que el usuario que haya iniciado sesión no se dé cuenta de que está ocurriendo! En algunos casos, un ataque CSRF no modifica la base de datos, como cerrar la sesión del usuario. Si bien no es inmediatamente dañino, puede ser molesto.

Salesforce cuenta con protecciones CSRF; esta protección está activada (y no puede desactivarse de forma predeterminada) en el menú Configuración. La protección envía un token con cada solicitud que el servidor valida antes de responder. Esto dificulta la vida del atacante, ya que tendría que averiguar tanto la URL como el token anti-CSRF.

Sin embargo, nuevamente, hay un caso de borde que la protección no cubre. Este es el momento exacto en el que se carga una página. La recomendación en este caso es evitar cambiar el estado de la base de datos al cargar la página. Es decir, no realice operaciones DML en la carga de Lightning Web Components ( constructor, connectedCallback, renderedCallback ).

Exposición de datos sensibles

A veces, necesita trabajar con datos confidenciales en su código, como contraseñas, claves de cifrado, tokens OAuth, información de pago, etc. Este tipo de datos nunca deben codificarse de forma rígida, sino que deben almacenarse correctamente en las aplicaciones. En Salesforce, hay varias funciones que puede utilizar para almacenar secretos de forma segura:

  • Credenciales con nombre : un tipo de metadatos que se utiliza para almacenar información sobre los puntos finales de las llamadas y que se puede hacer referencia fácilmente en Apex. Le permiten configurar la autenticación y mantener los secretos relacionados con la autenticación almacenados de forma segura en Salesforce.
  • Configuraciones personalizadas protegidas : configuraciones personalizadas que pertenecen a un paquete no son visibles en las organizaciones de los suscriptores.
  • Metadatos personalizados protegidos y Registros de metadatos personalizados protegidos : los tipos de metadatos personalizados que pertenecen a un paquete no son visibles para los suscriptores. También tiene la opción de proteger registros de metadatos personalizados individuales en lugar del tipo de metadatos personalizados.
  • Cifrado de plataforma de escudo : una función que le permite cifrar datos en reposo (en la base de datos) para requisitos de cumplimiento de seguridad más estrictos. Como desarrollador, sepa que cuando se utilizan campos encriptados de protección, existen algunas limitaciones de SOQL y SOSL.

Además, si necesita enviar información confidencial fuera de los límites de seguridad de Salesforce, puede cifrar sus datos y descifrarlos en el destino. Hay varias funciones en la clase Apex Crypto que lo ayudarán a implementar diferentes algoritmos para garantizar el secreto, la integridad, la autenticidad y el no repudio de los datos. De manera equivalente, puede encontrar bibliotecas JavaScript como CryptoJS con el mismo propósito y utilidades similares.

Próximos pasos

En esta publicación de blog, hemos cubierto algunas de las mejores prácticas de seguridad que debe seguir al desarrollar en la plataforma Salesforce. Esta no es una lista completa, ya que la seguridad es un tema importante, ¡pero es un buen punto de partida!

Para explicar estos conceptos con más profundidad, he creado una serie de videos. La serie contiene tres episodios de una hora que espero que disfruten. Mira la serie aquí:

Si quiere ponerse manos a la obra, le recomiendo que eche un vistazo a la ruta Desarrollar aplicaciones web seguras en Trailhead. Si desea consultar la documentación completa, consulte la Guía de seguridad de Salesforce .

Sobre el Autor

Alba Rivas trabaja como líder desarrolladora evangelista en Salesforce. Se centra en los componentes web Lightning y la estrategia de adopción de Lightning. Puedes seguirla en Twitter @AlbaSFDC ( http://twitter.com/AlbaSFDC ).

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/07/security-for-salesforce-developers.html

Categories
Developers Tutoriales de Salesforce

Aproveche al máximo sus proyectos DX con scripts de Node.js integrados ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Cuando crea un nuevo proyecto con el force:project:create la CLI de Salesforce o con la paleta de comandos de VS Code, el estado del proyecto predeterminado le proporciona algunas herramientas útiles. Una herramienta clave es un conjunto de scripts y utilidades de Node.js que mejoran su experiencia de desarrollador. En esta publicación, vamos a recorrer los aspectos clave de Node.js en un proyecto de Salesforce; aprenderá cómo puede usarlo para formatear, filtrar, ejecutar pruebas LWC y ejecutar comprobaciones previas a la confirmación. Echemos un vistazo a los scripts y dependencias que soportan esas acciones.

Node.js y el proyecto Salesforce

Es posible que se pregunte: "¿Por qué debería saber acerca de Node.js si estoy trabajando en un proyecto de Salesforce?" La respuesta es que puede prescindir de él, pero se perderá en términos de experiencia de desarrollador y calidad del código.

No enviará una aplicación de servidor Node, pero el poder de Node también reside en el hecho de que puede usarse como un motor de scripting independiente del sistema operativo. Puede usarlo para una variedad de tareas en su entorno de desarrollo local y CI. Por lo general, lo usamos para formatear, peinar y probar, pero puede ser creativo y hacer mucho más. Por ejemplo, estamos enviando un script de nodo en la aplicación de muestra eCars que implementa el proyecto de Salesforce en una organización, luego configura e implementa un par de aplicaciones de Heroku relacionadas.

El descriptor del proyecto Node de un vistazo

El package.json contiene información clave sobre el proyecto Node. En aras de la brevedad, no profundizaremos en todas las propiedades, pero echaremos un vistazo a las más importantes. Como referencia, aquí está la documentación sobre la estructura package.json .

El package.json contiene la lista de dependencias de las que depende un proyecto de Nodo. Las dependencias se dividen entre paquetes de tiempo de ejecución y solo de tiempo de desarrollo. En los proyectos de Salesforce, solo tenemos el último, ya que solo usamos Node en el momento del desarrollo (no enviamos un ejecutable de Node). Puede ver la lista de dependencias de desarrollo en la propiedad devDependencies Echaremos un vistazo más de cerca a estos en las secciones a continuación.

Otro aspecto importante de un proyecto de Node es el conjunto de scripts que proporciona en una propiedad de diccionario de scripts Los scripts le permiten ejecutar acciones personalizadas desde su terminal. Sin embargo, antes de que pueda hacer algo con ellos, primero debe instalar el proyecto Node con npm , el administrador de paquetes que se instala con Node.

Puede instalar el proyecto Node con este comando desde su terminal: npm install . Esto crea una copia de los paquetes instalados en el node_modules en la raíz del proyecto. La primera vez que lo instale, también obtendrá un nuevo package-lock.json que describe el árbol de dependencias de paquetes resuelto.

Una vez que el proyecto está instalado, puede ejecutar scripts con el npm run SCRIPT_ALIAS donde SCRIPT_ALIAS es la clave listada en el diccionario de scripts

Ahora que hemos cubierto las partes importantes del descriptor del proyecto Node, echemos un vistazo a las tareas que se proporcionan con el proyecto Node y sus scripts relacionados y dependencias de desarrollo.

Formatear con Prettier

Cuando se trabaja en equipo, es importante cumplir con las reglas de estilo comunes (tipo de sangría, posiciones de las llaves, desbordamiento de línea, etc.) para que toda la base del código se vea consistente sin importar quién lo haya escrito. Para abordar esta necesidad, el proyecto predeterminado de Salesforce Node incluye Prettier (un formateador de código) con un conjunto de complementos que lo ayudan a reformatear automáticamente su código.

Enviamos las siguientes dependencias de desarrollo para Prettier:

Puede activar un reformateo ejecutando el prettier que se define en el diccionario de scripts package.json :

 npm corre más bonito

Esto modifica su código fuente basado en las reglas configuradas en el archivo .prettierrc (ver documentación ) mientras ignora los archivos y carpetas listados en .prettierignore ( ver documentación ).

También proporcionamos un prettier:verify que escanea su base de código para verificar que cumpla con sus reglas de estilo. Esta secuencia de comandos no modifica sus archivos, pero informa un error tan pronto como encuentra un archivo no compatible. Esto se usa generalmente en flujos de trabajo de CI.

Revestimiento con ESLint

Linting (una forma de análisis de código estático) es otra mejora importante en la experiencia del desarrollador que se obtiene al utilizar el proyecto Node integrado. Esto le permite detectar posibles errores y malas prácticas en su base de código, como variables / funciones no utilizadas o pruebas sin afirmaciones.

El proyecto Node incluye ESLint (un linter de JavaScript) con un conjunto de complementos que cubren los componentes de Aura y LWC.

La lista de dependencias que enviamos para ESLint es un poco larga, pero afortunadamente su uso es extremadamente simple:

  • eslint : la biblioteca central que lints vanilla JS.
  • @ lwc / eslint-plugin-lwc : un complemento que contiene reglas de linting para el código LWC. Esto agrega soporte para decoradores y otras clases y reglas específicas del marco.
  • @ salesforce / eslint-config-lwc : un módulo que contiene un conjunto de configuraciones de ESLint (un conjunto de reglas de linting) para LWC. Al configurar el linting, puede elegir entre diferentes niveles de validación. La configuración recommended predeterminada es generalmente lo suficientemente buena para todos los proyectos (consulte la página del proyecto para ver otras opciones).
  • @ salesforce / eslint-plugin-lightning : reglas adicionales que son específicas de la plataforma Lightning. Esto está empaquetado en un módulo separado para que pueda trabajar sin él si construye con LWC OSS en lugar de en Platform.
  • @ salesforce / eslint-plugin-aura : un complemento con un conjunto de reglas de linting para el código Aura. Esto brinda soporte a la sintaxis y características específicas de Aura.
  • eslint-plugin-import : un complemento para trabajar con la sintaxis de importación / exportación de ES6 + y que valida las rutas.
  • eslint-plugin-jest : un complemento que trae reglas para trabajar con Jest (la biblioteca que usamos para probar LWC).

Para eliminar la pelusa de sus componentes Aura y LWC, simplemente ejecute npm run lint .

ESLint escanea todos los archivos JS que no están excluidos por los archivos .eslintignore (consulte la documentación ). ESLint obtiene su configuración (complementos, configuraciones, anulaciones de reglas, etc.) de los archivos eslintrc.json (consulte la documentación ). Encontrará ejemplos de esos archivos de configuración en las carpetas force-app/default/main/aura y force-app/default/main/lwc .

Prueba de código LWC con Jest

A diferencia del código Apex, la prueba de su código LWC se realiza en su máquina local gracias a la dependencia @ salesforce / sfdx-lwc-jest. Esta dependencia agrupa la biblioteca principal de Jest y un complemento específico para LWC.

Proporcionamos un puñado de scripts para probar:

  • test:unit ejecuta pruebas unitarias para LWC
  • test simplemente llama test:unit . Este alias duplicado se proporciona si desea encadenar otros tipos de pruebas o acciones al comando. Tenga en cuenta que test es el comando predeterminado para ejecutar pruebas y, a diferencia de los otros scripts, se puede llamar sin el argumento de run npm test .
  • test:unit:watch ejecuta pruebas LWC en modo reloj. En el modo reloj, su código se escanea continuamente en busca de cambios y se ejecutan las pruebas afectadas por sus cambios. Esto es extremadamente conveniente ya que le ahorra un tiempo valioso al escribir pruebas.
  • test:unit:debug ejecuta pruebas de LWC en modo de depuración (consulte estos videos para obtener una introducción a la depuración de pruebas de LWC )
  • test:unit:coverage ejecuta pruebas unitarias de LWC y genera un informe de cobertura de código. Esto le permite rastrear el código que no está cubierto por las pruebas y usar funciones como el resaltado de cobertura de código LWC .

Ejecución de comprobaciones previas a la confirmación con Husky y lint-staged

Más allá de los scripts manuales que ejecuta en su proyecto, el proyecto Node incluye algunas capacidades de automatización interesantes que mejoran la calidad del código. Usamos husky y lint-staged para configurar un gancho de confirmación previa que formatea y lints código preparado en Git antes de que pueda confirmarse. Si alguna de estas comprobaciones falla, la operación de confirmación se cancela. Este mecanismo le ayuda a mantener limpio su repositorio.

Las comprobaciones previas al compromiso complementan, pero no reemplazan, Integración continua

No tiene nada que hacer además de usar Git e instalar el proyecto Node para beneficiarse de las comprobaciones previas a la confirmación, pero lea más si está interesado en aprender más sobre cómo funciona esto.

Cuando instalas el proyecto Node, la postinstall comandos postinstall se ejecuta automáticamente, ya que es una de las secuencias de comandos estándar del ciclo de vida de Node.js. El postinstall instala Husky. Husky encuentra su instalación de Git y registra algunos ganchos según la configuración proporcionada en la carpeta .husky

De forma predeterminada, enviamos el proyecto con un .husky/pre-commit que activa el script de precommit package.json . El script de precommit lint-staged con las reglas definidas en la propiedad lint-staged package.json .

lint-staged ejecuta scripts en archivos individuales que se preparan en Git. En la configuración predeterminada del proyecto, ejecutamos Prettier y ESLint en todos los archivos preparados. A diferencia de los prettier y lint , los archivos que están a punto de confirmarse (archivos en etapas) se ignoran.

Consejo 1: puede ejecutar pruebas LWC en componentes modificados agregando esta lint-staged a las reglas existentes:

 "** / lwc / **": [ "sfdx-lwc-jest - --bail --findRelatedTests"
]

Consejo 2: si necesita omitir las comprobaciones previas a la confirmación para una confirmación , agregue una —no-verify a su comando de confirmación:

 git commit -m "Algunos cambios" --no-verify

Envolviendolo

Cubrimos mucha información, pero ahora debería tener un mayor sentido de la utilidad del proyecto Node.js integrado que se envía en los proyectos de Salesforce. Ha aprendido cómo puede usarlo para formatear, filtrar, probar y ejecutar comprobaciones previas a la confirmación. Recuerde que esto es solo el comienzo y que puede ampliar este descriptor de proyecto para aprovechar al máximo su experiencia de desarrollador y mejorar sus flujos de trabajo de CI.

Te dejamos con un resumen del descriptor de nodo predeterminado con las acciones que cubrimos en esta publicación:

Sobre el Autor

Philippe Ozil es un promotor principal de desarrolladores en Salesforce, donde se centra en la plataforma Salesforce. Escribe contenido técnico y habla con frecuencia en conferencias. Es un desarrollador de pila completa y disfruta trabajar en proyectos de DevOps, robótica y realidad virtual. Síguelo en Twitter @PhilippeOzil o revisa sus proyectos de GitHub @pozil .

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/07/make-the-most-of-your-dx-projects-with-built-in-node-js-scripts.html

Categories
Developers Tutoriales de Salesforce

¿Cómo aprenden y utilizan los desarrolladores Salesforce? ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

En Salesforce Developer Relations, nuestro objetivo principal es inspirar a los desarrolladores de Salesforce y ayudarlos a tener éxito. Para que nuestra misión sea impactante, necesitamos saber qué es lo que lo entusiasma, así como lo que espera, desea y necesita.

Es por eso que, todos los años, realizamos una encuesta global o dos para escuchar a nuestros desarrolladores y comprender las tendencias en nuestro ecosistema. El año pasado, publicamos una publicación de blog que resume las tendencias que encontramos más interesantes a partir de los resultados de la encuesta de 2020. En esta publicación, continuaremos donde lo dejamos resumiendo lo que descubrimos en la encuesta que realizamos en enero. 2021. ¡Compararemos los dos y veremos similitudes y también algunos hallazgos nuevos!

Datos demográficos de los desarrolladores de Salesforce

Como observamos la última vez, más de la mitad de los desarrolladores de Salesforce en todo el mundo tienen menos de 35 años. Además, la mayoría tiene su sede en América del Norte, Europa Occidental e Israel.

Al observar las industrias en las que trabajan los desarrolladores de Salesforce, curiosamente, la encuesta de 2021 muestra un aumento del 5% en los desarrolladores de Salesforce que informan que trabajan en SaaS. Las siguientes tres industrias principales siguen siendo las mismas:

  • Servicios financieros, banca y seguros
  • Salud, medicina, biotecnología y farmacéutica
  • Asesoramiento empresarial y servicios legales

Las siguientes dos industrias populares son las telecomunicaciones y el comercio minorista.

¿Por qué los desarrolladores se basan en Salesforce?

¡Todos en Salesforce están interesados en estos datos! Está claro que nuestra comunidad de desarrolladores trabaja arduamente para ayudar a sus clientes a tener éxito, como muestran estos números:

  • El 48% busca ayudar a resolver un problema para un cliente.
  • El 44% se está desarrollando en Salesforce para llegar a su mercado objetivo.
  • El 38% busca desarrollar su carrera con nosotros.

La mayoría de los desarrolladores de Salesforce están creando aplicaciones web o para SaaS, pero notamos un aumento en las personas que trabajan en AppExchange o extensiones de sistemas de terceros.

Ella me ama, ella no me ama

En esta última encuesta, les hicimos a los desarrolladores de Salesforce muchas preguntas sobre su relación y experiencia con las soluciones y productos de Salesforce. A partir de sus respuestas sobre el uso, el conocimiento, la facilidad de implementación, la escalabilidad, la flexibilidad y muchos otros atributos, descubrimos que los desarrolladores de Salesforce adoran Sales Cloud, Service Cloud y la plataforma Salesforce. Aunque está menos entusiasmado con Einstein Prediction Builder, Quip y Pardot, muchos desarrolladores dicen que también planean usar Einstein Prediction Builder en los próximos 12 meses, ¡más que cualquier otro producto!

Queríamos tener una mejor idea de qué marcos del lado del cliente están utilizando los desarrolladores de Salesforce, y nos complace ver que el 70% de los encuestados han adoptado Lightning Web Components. El segundo y el tercero más populares son Aura y JQuery.

¿Cómo aprenden los desarrolladores de Salesforce?

Los datos nos dicen que existe una combinación justa de desarrollo programático y declarativo en la plataforma Salesforce. Si bien muchos de ustedes escriben código a diario, a un nivel muy alto (57%), su uso declarativo diario también es muy alto (42%). También nos parece fascinante que los estudIAntes que aún no están trabajando como desarrolladores estén significativamente interesados en el aprendizaje automático / IA, la ciencia de datos, el desarrollo móvil, la realidad aumentada y virtual.

Para lograr sus objetivos, los cinco recursos principales que utilizan los desarrolladores de Salesforce son:

  1. Trailhead
  2. Intercambio de pila de Salesforce
  3. Documentación para desarrolladores de Salesforce
  4. Comunidad pionera
  5. Foros de desarrolladores de Salesforce

También mencionamos nuestro canal de YouTube esta vez en la encuesta y descubrimos que el 87.8% de los encuestados usa el canal de YouTube para desarrolladores de Salesforce. También te encanta el contenido, y casi la mitad de ti le da 5 estrellas (de 5) y otro tercio le da 4 estrellas. ¿Te has suscrito ya?

[contenido incrustado]

La última vez mencionamos cómo la Galería de muestras es una oportunidad perdida para muchos desarrolladores, y solo la mitad de ustedes la usa activamente. ¿Lo has comprobado ya? La Galería de muestra es una gran colección de aplicaciones para desarrolladores de Salesforce a la que es conveniente consultar y aprender. Agregamos nuevas aplicaciones a la galería con regularidad, como Apex Recipes con más de 100 ejemplos de cómo usar Apex, o la aplicación de demostración AMP Email con ejemplos interactivos usando AMP Email para Salesforce Marketing Cloud. También actualizamos las aplicaciones para cada versión para asegurarnos de que lo que consulte esté siempre actualizado.

¿Que sigue?

Estas encuestas y los datos que recopilamos nos ayudan a comprenderlo mejor, de modo que podamos realizar mejoras por usted. ¿Te ves reflejado en los datos? Esperamos que lo haga, pero si no, comuníquese con nosotros en Twitter , LinkedIn o Telegram utilizando el hashtag #SFDevSurvey. Si se perdió la encuesta esta vez, ¡esperamos que pueda participar en nuestra próxima encuesta, que se realizará en octubre de 2021!

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/07/how-do-developers-learn-and-use-salesforce.html

Categories
Developers Tutoriales de Salesforce

TrailheaDX '21 para desarrolladores ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

TrailheaDX reúne a los pioneros de todo el mundo para expandir sus habilidades de Salesforce, profundizar con los expertos en productos y obtener adelantos de lo que se avecina. Este año, puede experimentar nuestro evento de aprendizaje fuera de este mundo de forma gratuita, desde cualquier lugar.

Transmitiremos contenido en vivo, interactivo y dirigido por expertos a través de 5 canales el 23 de junio (hora del Pacífico). Ya sea que esté planeando sintonizar desde casa, organizar una fiesta de observación virtual con su comunidad o unirse cuando y donde funcione mejor, encontrará mucho en la tienda para los desarrolladores de Salesforce en TrailheaDX '21.

Esto es lo que puede esperar el gran día:

Canal de desarrollador

Únase al Canal de desarrolladores para conocer los recursos y herramientas diseñados para ayudarlo a innovar y crear aplicaciones empresariales basadas en datos líderes en la industria. Además, explore las últimas tecnologías de Salesforce con los gerentes de producto e ingenieros que las desarrollaron. Vea la lista de canales a continuación.

Cree aplicaciones basadas en datos con Tableau y Mulesoft

Vea cómo los desarrolladores están tomando el control de sus datos con MuleSoft y Tableau. Escuche a Jordan Schuetz, promotor de desarrolladores de Mulesoft, y Geraldine Zanolli, gerente de productos de Tableau, cómo fusionar datos de Salesforce utilizando MuleSoft y la plataforma de desarrollo de Tableau.

Desarrolle y ejecute comercio sin cabeza con API

¿Interesado en ir sin cabeza? Descubra cómo las API de Salesforce Commerce y las herramientas para desarrolladores desbloquean una nueva agilidad. Obtiene la flexibilidad para crear cualquier interfaz que pueda soñar.

¿Prefieres no construir el tuyo propio? Te tenemos cubierto. Vea cómo las API de PWA Kit, Managed Runtime y Commerce se combinan como parte de una experiencia de desarrollador moderna para escaparates comerciales sin cabeza.

Conozca Salesforce Jamstack: Experimente Cloud + LWC

Únase a nosotros para echar un vistazo al futuro de Experience Cloud, impulsado por Lightning Web Runtime. Le presentaremos nuevas tecnologías que permiten a los desarrolladores crear experiencias comerciales a escala del consumidor, con una gran portabilidad, selección de servicios y seguridad del lado del cliente.

Verá demostraciones detalladas que combinan tiempos de carga inferiores a un segundo con un potente acceso a datos, recorrerá la hoja de ruta y verá cómo la próxima generación de componentes web Lightning cobra vida en Experience Cloud.

Cree experiencias escalables: funciones y CLI

Desarrolladores, ¡el juego ha cambiado! No se pierda este recorrido práctico de la próxima generación de desarrollo en Salesforce.

Compartiremos nuestra experiencia de desarrollador unificada y el camino hacia la unificación de CLI. Luego, profundizaremos en las funciones de Salesforce, mostrándote cómo usar Apex y otros lenguajes para crear e implementar experiencias que aporten una escala elástica y bajo demanda a la lógica de tu negocio. Saldrá listo para crear experiencias conectadas utilizando lenguajes de la industria, con una CLI.

Conozca a los equipos: plataforma

Tienes preguntas, tenemos respuestas. Únase a los gerentes de productos de Salesforce Andy Fawcett, Claire Bianchi y Chris Peterson para obtener respuestas a sus preguntas sobre la plataforma Salesforce, ver demostraciones y obtener información sobre nuevas funciones. Conducido por Julián Duque .

Echa un vistazo a la gama completa de canales para desarrolladores y planifica tu agenda TDX '21 perfecta ahora.

Éxito de Trailblazer desde cualquier lugar

Es un mundo nuevo, una nueva normalidad, y no volveremos a ser como eran las cosas. Todos somos digitales. Trabajamos desde cualquier lugar y atendemos a los clientes en todas partes. Para tener éxito, tenemos que adoptar una nueva forma de operar. Este es el imperativo de Success from Anywhere.

Únase a Parker Harris y a los invitados especiales del Main Show de TrailheaDX para descubrir cómo los pioneros como usted (desarrolladores, administradores, arquitectos, socios y líderes de TI) pueden utilizar las últimas innovaciones en la plataforma Customer 360 para innovar en cualquier lugar, automatizar cualquier cosa, escalar en cualquier lugar. y empoderar a todos. Le mostraremos cómo clientes como Royal Bank of Canada y CarMax están utilizando la plataforma Customer 360 para acelerar su transformación digital.

Demostraciones y debates

Experimente demostraciones y únase a sesiones interactivas y atractivas con clientes y expertos de Salesforce para conocer las últimas y mejores funciones de Salesforce.

Únase a las salas de expertos para explorar demostraciones sobre las funciones de Salesforce para desarrolladores, administradores, arquitectos y socios de AppExchange.

Colabore en Circles of Success , sesiones interactivas con clientes en las que aprenderá las mejores prácticas, desafíos y consejos de adopción.

Asista a las sesiones de preparación para la certificación dirigidas por nuestros expertos que compartirán sus conocimientos sobre varios temas de exámenes de certificación.

Reúnase en torno a las fogatas de la comunidad de Trailblazer con los líderes de la comunidad de Trailblazer y únase a discusiones dinámicas sobre cómo aprender las habilidades de Salesforce, obtener credenciales dignas de un currículum y conectarse con compañeros de Trailblazer.

Canales de administrador, arquitecto, ecosistema y comunidad y líder de TI

Encontrará aún más para explorar en los canales Admin, Architect, Ecosystem & Community y IT Leader. Aquí hay un breve vistazo a cada canal:

En el canal de administración , le permitiremos integrarse sin código, le permitiremos automatizar en toda la plataforma y escuchar a los pioneros que están elevando sus carreras al aprender las habilidades que necesitan.

En Architect Channel , aprenderá sobre las últimas innovaciones de productos y herramientas para ayudarlo a entregar valor a la velocidad del negocio, alinear a sus equipos y partes interesadas, y escalar con resiliencia.

En Ecosystem & Community Channel , aprenderá cómo desarrollar su negocio en AppExchange, obtendrá orientación de expertos y emprendedores, y adquirirá habilidades sobre las últimas innovaciones, además de obtener información privilegiada sobre lo que sigue para nuestra Comunidad Trailblazer.

El canal de líderes de TI se trata de acelerar la transformación digital. Aprenderá cómo capacitar a sus equipos, conectarse mejor con sus clientes y socios y descubrir nuevas formas de utilizar las capacidades de Salesforce listas para usar para escalar con velocidad y seguridad.

Y mucho más

Terminaremos la transmisión en vivo con una edición especial "Meet the Execs" de True to the Core, así como un invitado destacado.

En True to the Core: Meet the Execs, tendrá la oportunidad de escuchar lo último y obtener respuestas a sus preguntas por parte de Bret Taylor (presidente y director de operaciones), Parker Harris (cofundador y director de tecnología) y Sarah Franklin ( Presidente y director de marketing), junto con David Schmaier (presidente y director de producto), Srinivas Tallapragada (presidente y director de ingeniería), Lidiane Jones (vicepresidenta ejecutiva y directora ejecutiva, Commerce Cloud) y Patrick Stokes (vicepresidente ejecutivo y gerente general, plataforma) .

¿Tiene alguna pregunta o tema que le gustaría que los ejecutivos abordaran durante True to the Core? ¡Envíanoslos!

También tenemos algunas sorpresas guardadas. Esté atento a algunos anuncios muy especiales durante el día 23 de junio, además de todo el mes, aquí mismo en el blog del desarrollador.

¿Qué puedes hacer ahora?

Regístrese para TrailheaDX '21

¡Agrega el Canal de Desarrolladores a tu agenda!

Envíenos sus preguntas para las sesiones True to the Core

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/06/trailheadx-21-for-developers.html

Categories
Developers Tutoriales de Salesforce Uncategorized

Trabajar con listas de selección en Apex y Lightning Web Components ☁️

Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Las listas de selección son una excelente manera de personalizar los objetos de Salesforce, proporcionando una solución reutilizable y fácil de administrar con validación incorporada. Sin embargo, acceder a los valores de la lista de selección de manera programática no es sencillo y es importante comprender las diversas técnicas y trampas involucradas. En esta publicación, discutiremos diferentes métodos para acceder a los valores de la lista de selección en Apex y Lightning Web Components. Cubriremos sus limitaciones y lo dejaremos con las mejores prácticas para seleccionar el enfoque correcto (según su caso de uso).

Usar listas de selección en Apex

Una práctica común para acceder a los valores de la lista de selección desde un disparador o un controlador de servidor es utilizar Apex dinámico. Dynamic Apex no se limita a SOQL dinámico, de hecho, le permite analizar objetos y campos mediante programación con métodos del espacio de nombres Schema . Con esta técnica, puede responder preguntas como: ¿Cuáles son los campos de un objeto? ¿Cuál es el tipo de un campo en particular? O, ¿cuáles son los valores posibles de un campo de lista de selección?

El siguiente ejemplo de código muestra cómo puede recuperar valores de lista de selección para el campo "Industria" del objeto "Cuenta" como una lista de Schema.PicklistEntry utilizando getDescribe() y getPicklistValues():

 // Describe el campo Account.Industry
Schema.DescribeFieldResult fieldDescription = Account.Industry.getDescribe ();
// Obtener valores de lista de selección de la descripción del campo
Entradas de lista = fieldDescription.getPicklistValues (); // Haz algo con las entradas
para (Entrada Schema.PicklistEntry: entradas) {
/ *
entry.getValue ()
entry.getLabel ()
entry.isActive ()
entry.isDefaultValue ()
* /
}

Si bien este enfoque es funcional y simple, tiene tres limitaciones importantes:

  1. Se basa en nombres de campos y objetos codificados de forma rígida.
  2. Devuelve valores que incluyen valores de lista de selección inactivos.
  3. No maneja valores para tipos de registros específicos.

Puede abordar fácilmente los dos primeros problemas escribiendo un método auxiliar genérico que funcione con cualquier campo y que solo devuelva las entradas activas de la lista de selección:

 // Recupera valores de lista de selección activos para un objeto y campo determinados
// Ejemplo: getPicklistValues (Account.Industry)
lista estática pública <Schema.PicklistEntry> getPicklistValues ( Campo Schema.sObjectField) { // Obtener todos los valores de la lista de selección Lista <Schema.PicklistEntry> entradas = field.getDescribe (). GetPickListValues (); // Devuelve solo valores de lista de selección activos Lista <Schema.PicklistEntry> activeEntries = nueva Lista <Schema.PicklistEntry> (); para (Entrada Schema.PicklistEntry: entradas) { if (entrada.isActiva ()) { activeEntries.add (entrada); } } return activeEntries;
}

El fragmento anterior es una implementación ingenua sin almacenamiento en caché, pero puede ver que las cosas comienzan a ponerse un poco más detalladas.

Otra consideración importante (que a menudo se pasa por alto) al acceder a los valores de las listas de selección es el hecho de que los administradores pueden restringir los valores de las listas de selección para un tipo de registro determinado. El enfoque dinámico de Apex que acabamos de cubrir no es compatible con este escenario. Si necesita trabajar con valores de lista de selección para tipos de registros específicos, deberá realizar una llamada a este punto final de la API de la interfaz de usuario :

 / ui-api / object-info / {objectApiName} / picklist-values / {recordTypeId} / {fieldApiName}

En aras de la brevedad, no mostraremos el código Apex completo en esta publicación, pero puede consultar una implementación en el repositorio de PicklistUtils . Este proyecto proporciona una PicklistUtils reutilizable con una cobertura completa de código y almacenamiento en caché. PicklistUtils ayuda a manejar todos los casos de uso de listas de selección con llamadas simples:

 // 1. Recuperar valores de lista de selección activos para un objeto sin tipo de registro
// ... con referencias a objetos y campos
Valores de lista = PicklistUtils.getPicklistValues (
Account.sObjectType,
Cuenta.Industria
);
// ... o con objeto y campo especificados como cadenas
Valores de lista = PicklistUtils.getPicklistValues (
'Cuenta',
'Industria'
); // 2. Recuperar valores de lista de selección activos para un tipo de registro específico
PicklistUtils.PicklistEntries valores = PicklistUtils.getPicklistValues (
'CustomerRequest__c', // Nombre del objeto
'0124H000000cz6R', // ID del tipo de registro
'Priority__c' // Nombre del campo
);

Uso de listas de selección en componentes web Lightning

Si está creando un componente web Lightning que se basa en valores de lista de selección, puede llamar a un controlador Apex personalizado para recuperar esos valores con los métodos que acabamos de describir. Pero la buena noticia es que existe una solución más sencilla. Usted puede evitar por completo Apex llamando directamente a la API de interfaz de usuario con el getPicklistValues adaptador de cable desde el lightning/uiObjectInfoApi módulo.

El getPicklistValues recupera todos los valores de la lista de selección para un tipo de registro y un nombre de campo determinados. El uso del adaptador es interesante por razones de rendimiento porque se beneficia de la caché de Lightning Data Service. Además, esto también reduce la cantidad de código Apex que debe mantener y probar (sin necesidad de un controlador Apex personalizado).

A continuación, se muestra un ejemplo de cómo puede recuperar todos los valores de la lista de selección para el campo Industria del objeto Cuenta:

 importar {LightningElement, wire} desde 'lwc';
importar {getPicklistValues} de 'lightning / uiObjectInfoApi';
importar INDUSTRY_FIELD desde '@ salesforce / schema / Account.Industry'; exportar clase predeterminada El ejemplo extiende LightningElement { @wire (getPicklistValues, { recordTypeId: '012000000000000AAA', // ID de tipo de registro predeterminado fieldApiName: INDUSTRY_FIELD }) getIndustryPicklistValues ({error, data}) { si (datos) { / * Haga algo con data.defaultValue y data.values [] Los valores se representan como objetos como este: { atributos: nulo, etiqueta: "Agricultura", valido para: [], valor: "Agricultura" } * / } más si (error) { // Manejar error } }
}

Para obtener un ejemplo completo de cómo usar getPicklistValues en combinación con otros adaptadores de API de interfaz de usuario, consulte la publicación de blog Recuperación de valores de lista de selección sin usar Apex.

Palabras de cierre

Con esto concluye nuestro recorrido por las diferentes técnicas para acceder a los valores de la lista de selección en Apex y Lightning Web Components. Aquí hay un resumen de las mejores prácticas que cubrimos en esta publicación:

  • Utilice Apex dinámico cuando trabaje con registros sin tipo de registro.
  • Utilice las llamadas de la API de la interfaz de usuario cuando trabaje con tipos de registros en Apex.
  • Utilice el adaptador de cable getPicklistValues de la API de interfaz de usuario cuando trabaje con componentes web Lightning.
  • Utilice una clase de utilidad de Apex como PicklistUtils para evitar la duplicación de código.

Sobre el Autor

Philippe Ozil es un promotor principal de desarrolladores en Salesforce, donde se centra en la plataforma Salesforce. Escribe contenido técnico y habla con frecuencia en conferencias. Es un desarrollador de pila completa y disfruta trabajar en proyectos de DevOps, robótica y realidad virtual. Síguelo en Twitter @PhilippeOzil o revisa sus proyectos de GitHub @pozil .

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/05/working-with-picklists-in-apex-and-lightning-web-components.html

Categories
Developers

¡Las 5 principales joyas de componentes Lightning del lanzamiento de Salesforce!

El marco moderno del componente Lightning es un marco de interfaz de usuarioparadesarrollar aplicaciones web dinámicas para dispositivos móviles y de escritorio.Como es el caso concada nueva versión,laversiónmás recienteSummer’21 está repleto de características ricas incluyendo, el Rayo de componentes que acaba de agregar características!

Actualmente, el Summer’21   lanzamiento está disponible bajo el programa de prelanzamiento . Los días 07 y 08   de mayo , los Sandboxes se actualizarán, como resultado, su organización obtendrá la apariencia del lanzamiento de Summer ’21 . En caso de que no haya leído las 562 páginas completas de Salesforce Summer’21   notas de la versión, consulte el resumen rápido de la versión Summer’21 , Versión Pardot Summer’21: Las 5 funciones principales y las Diez gemas principales de Salesforce Lightning Experience escrito por mí.

Peinéa través de las notas de la versión y destacó la capacidad de añadir al componente Web Rayo características. Créame, ¡fue difícil detenerse en solo cinco! Para comenzar, aquí está mi opinión sobre las características más interesantes del componente Lightning del lanzamiento de Summer’21.

  1. Aplicar modificadores de acceso en las propiedades de Apex en el marcado de componentes Lightning (actualización, impuesta) : – Esta actualización hace que los componentes Lightning sean coherentes con el uso de las propiedades de Apex en otros contextos. Por ejemplo, una expresión de marcado ya no puede acceder a una propiedad de Apex con un captador de Apex privado. Esta actualización de la versión no afecta el uso de los establecedores de Apex.

    Veamos un ejemplo de una clase de Apex con un captador privado para una propiedad de clase de contador.

     public class EnforcePrivateGetter { @AuraEnabled contador de enteros públicos { obtención privada ; establecer; } @AuraEnabled public static EnforcePrivateGetter GetRepro2 () { Resultado de EnforcePrivateGetter = new EnforcePrivateGetter (); resultado . contador = 2 ; devolver resultado ; }
    }

    Con la actualización habilitada, este componente de Aura no puede acceder al getter privado con la expresión {! v.apexObject.counter}. La misma restricción se aplica a un componente web Lightning.

     <aura: component controller = "EnforcePrivateGetter" access = "global"> <aura: handler name = "init" value = "{! this}" action = "{! c.doInit}" /> <aura: atributo type = "EnforcePrivateGetter" name = "apexObject" /> contador = {! v.apexObject.counter} <br> </br>
    </ aura: componente>

    Aquí está el controlador de JavaScript.

    ({ doInit : function ( cmp , ev ) { var action = cmp . get ( "c.GetRepro2" ); acción . setCallback ( esto , función ( respuesta ) { var estado = respuesta . getState (); if ( estado === "ÉXITO" ) { cmp . set ( 'v.apexObject' , respuesta . getReturnValue ()); } de lo contrario si ( estado === "ERROR" ) { consola . log ( 'Error:' + JSON . stringify ( errores )); } }); $ A. enqueueAction ( acción ); }
    })

    Con la actualización habilitada, la solución es eliminar el modificador de acceso privado en el captador y cambiar la definición de la variable de clase a:

     contador de enteros públicos { get ; establecer; }

    Para que una propiedad de Apex sea legible fuera de la clase de Apex, la propiedad no puede tener un modificador de acceso privado o protegido.

  2. Acceda de forma segura a los componentes de Aura (actualización) : – Esta actualización garantiza que un componente externo con acceso = «público» sea accesible solo para otros componentes dentro de su mismo espacio de nombres o para componentes internos de Salesforce. Esta actualización se aplicará en Winter ’22 .
    1. La solución de este problema puede revelar otros problemas que antes no se habían detectado. Por ejemplo, antes de esta actualización, una devolución de llamada que no estaba envuelta en $ A.getCallback () podía perder su contexto pero aún ejecutarse correctamente. Después de esta actualización, si una devolución de llamada pierde su contexto, la verificación de acceso falla con un error. Recomendamos realizar estos pasos de prueba en un entorno de zona de pruebas para evaluar el impacto de la actualización de la versión y corregir cualquier error de acceso a los componentes antes de que se habilite automáticamente en Winter ’22 .
      1. En Configuración, en el cuadro Búsqueda rápida, ingrese Publicar actualizaciones y , a continuación, seleccione Publicar actualizaciones .
      2. Para Enable Aura Component Access Fix, habilite la ejecución de prueba de actualización de lanzamiento.
      3. Pruebe las páginas con componentes personalizados y observe si hay mensajes de error, como Error en la comprobación de acceso . en el registro de la consola.
      4. Repare los componentes rotos.
      5. Cuando se complete la prueba manual, desactive la ejecución de la prueba de actualización de la versión y transfiera los cambios de código a producción.
      6. En producción, habilite la actualización de la versión o espere a que se habilite automáticamente en Winter ’22 .
  3. Habilitar recursos estáticos seguros para componentes Lightning (actualización, pospuesta) : – Esta actualización de lanzamiento se pospuso indefinidamente mientras cambiamos la implementación para reducir el impacto en el cliente. La actualización de lanzamiento no se aplicará en su forma actual. No lo habilites.
  4. Nuevos componentes web Lightning : estos componentes son nuevos y requieren API versión 52.0 y posterior.
    1. lightning-quick-action-panel : crea modales de acción rápida con el mismo estilo que el modal de Salesforce Lightning Design System (SLDS). Con este componente, puede personalizar las acciones de la pantalla y seguir teniendo una interfaz de usuario coherente en todas las acciones. Use lightning-quick-action-panel con el objetivo lightning__RecordAction para usar su componente personalizado como una acción rápida en una página de registro.
    2. lightning-service-cloud-voice-toolkit-api : este componente proporciona acceso a los oyentes de eventos y métodos para la API de Service Cloud Voice Toolkit, lo que permite que su componente escuche los eventos que tienen lugar durante las llamadas telefónicas con los agentes de servicio.
  5. Cree ganchos de estilo para componentes web Lightning : – Para exponer ganchos de estilo para sus componentes personalizados, use las propiedades personalizadas de CSS. Las propiedades personalizadas de CSS también facilitan la lectura y la actualización del código.

      Para definir una propiedad personalizada de CSS en la hoja de estilo de un componente, anteponga la propiedad con . Para insertar el valor de la propiedad, use var ()

     :anfitrión { - color importante: rojo;
    } .importante { color: var (- color importante);
    }

    Las propiedades personalizadas de CSS seheredan . Las propiedades heredadas perforan la sombra DOM. Algunas propiedades de CSS, como el color , también se heredan. Debido a que las propiedades personalizadas de CSS se heredan, un consumidor puede establecer sus valores en un nivel superior en el árbol DOM y diseñar su componente.

    Estas propiedades personalizadas de CSS crean ganchos de estilo para dos temas: claro y oscuro. Pase el valor de respaldo como un segundo parámetro opcional a var () .

     / * myComponent.css * / .luz { color de fondo: var (- light-theme-backgroud-color, lightcyan); color: var (- color de texto de tema claro, azul oscuro);
    } .oscuro { color de fondo: var (- color de fondo del tema oscuro, gris oscuro); color: var (- color-de-texto-tema-oscuro, blanco-fantasma);
    }

    Un consumidor puede establecer valores para los ganchos de estilo para cambiar los colores del tema.

     / * consumerComponent.css * / :anfitrión { --light-theme-backgroud-color: honeydew; --light-theme-text-color: verde oscuro; --dark-theme-background-color: granate; --dark-theme-text-color: marfil;
    }
    

¡Mejoras adicionales dignas de mención!

  1. Implemente una nueva etiqueta personalizada y un componente juntos : – Implemente una nueva etiqueta personalizada y una referencia a esa etiqueta personalizada en un componente web Lightning existente en una sola implementación. Anteriormente, implementó la nueva etiqueta personalizada y luego le agregó una referencia en un componente web Lightning existente en una segunda implementación.
  2. Supervise los cambios de componentes Lightning en la pista de auditoría de configuración : – Utilice la pista de auditoría para realizar un seguimiento cuando sus usuarios crean, cambian o eliminan un componente Lightning personalizado. El historial de auditoría es especialmente útil cuando varios desarrolladores trabajan en componentes.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://automationchampion.com/2021/05/04/top-5-lightning-component-gems-of-salesforce-summer21-release/

Categories
Developers Salesforce

Preguntas de la entrevista de nivel intermedio a avanzado sobre Apex programable

[contenido incrustado]

P. ¿Explica el código para programar Apex por lotes para que se ejecute a intervalos regulares?

P. ¿Qué es System. Calendario ?

Una vez que haya implementado la interfaz programable, use el método system.schedulable para ejecutar la clase.

El método system.schedule () toma 3 parámetros:
1. Nombre del trabajo
2. Una expresión que se usa para representar la hora y la fecha de la operación.
3. El objeto de la clase que desea ejecutar.

Una expresión se escribe en forma de ‘Segundos, minutos, horas, día del mes, día del mes de la semana, año opcional’.

‘Segundos’: 0-60
‘Min’: 0-60
‘Horas’: 0-24
‘Días-Meses’: 1-31
‘Mes’: 1-12
‘Día-Semana’: 1-7
‘Año opcional’: –

P. ¿Qué es el tipo de devolución de system.schedule?

El método System.schedule devuelve el ID del trabajo en formato de cadena.

P. ¿Explique cómo utilizar System.schedule?

P. ¿Escribe una expresión para programar una operación el martes de enero a las 12:30?
‘0 30 12? 1 MARTES
‘0 30 12? 1 3 ‘
‘Segundos’: 0
‘Min’: 30
‘Horas’: 12
‘Días-Meses’:?
‘Mes’: 1
‘Día-Semana’: 3
‘Año opcional’: –
P. Escriba la expresión para programar una operación todos los días del SEP a las 12:30 PM.
‘0 30 12 * SEP?’
‘0 30 12 * 9?’
‘Segundos’: 0
‘Min’: 30
‘Horas’: 12
‘Días-Meses’: *
‘Mes’: 9
‘Día-Semana’:?
‘Año opcional’: –
Q. Expresión para programar cada hora el 11 de SEP.
‘0 30 * 11 9?’
‘Segundos’: 0
‘Min’: 30
‘Horas’ : *
‘Días-Meses’: 11
‘Mes’: 9
‘Día-Semana’:?
‘Año opcional’: –

P. Desea programar un trabajo por lotes de una sola vez y no de nuevo. ¿Cómo hacerlo?

System.scheduleBatch () se usa para ejecutar una programación de un trabajo por lotes solo una vez para un tiempo futuro. Este método tiene 3 parámetros.

parámetro 1: instancia de una clase que implementa la interfaz Database.Batchable.
param 2: Nombre del trabajo.
parámetro 3: intervalo de tiempo después del cual el trabajo debe comenzar a ejecutarse.
param 4: Es un parámetro opcional que definirá el no. de eso procesado a la vez. System.scheduleBatch () devuelve el ID del trabajo programado.
Podemos usar la identificación del trabajo para cancelar el trabajo.

Este método devuelve el ID de trabajo programado, también llamado ID de CronTrigger .

Este método está disponible solo para clases por lotes y no requiere la implementación de la interfaz Programable. Esto facilita la programación de un trabajo por lotes para una ejecución.

P. ¿Cómo obtener el recuento de trabajos programados de Apex mediante programación?

Puede consultar mediante programación los objetos CronTrigger y CronJobDetail para obtener el recuento de trabajos programados de Apex.

P. Si hay uno o más trabajos programados activos para una clase de Apex, ¿puede actualizar la clase o cualquier clase a la que se hace referencia en la interfaz de usuario de Salesforce?

Si hay uno o más trabajos programados activos para una clase de Apex, no puede actualizar la clase ni ninguna de las clases a las que hace referencia esta clase a través de la interfaz de usuario de Salesforce. Sin embargo, puede habilitar implementaciones para actualizar la clase con trabajos programados activos mediante la API de metadatos.

P. ¿Apex Scheduler se ejecuta en modo de sistema?

El planificador se ejecuta como sistema: todas las clases se ejecutan, tenga o no el usuario permiso para ejecutar la clase.

P. ¿Cómo llamar a Apex por lotes desde una clase programable?

Cree una instancia de batchClass y luego pase la instancia en database.executebatch

Una forma más sencilla de programar un trabajo por lotes es llamar al método System.scheduleBatch sin tener que implementar la interfaz Programable.

P. ¿Cómo obtener el nombre del trabajo y el tipo de trabajo para los trabajos programados?

Puede obtener el nombre del trabajo y el tipo de trabajo del registro CronJobDetail asociado con el registro CronTrigger.

P. La llamada no es compatible con Apex programado, entonces, ¿cuál es la alternativa?

Las llamadas de servicios web síncronos no son compatibles con Apex programado. Para poder hacer llamadas, realice una llamada asincrónica colocando la llamada en un método anotado con @future (callout = true) y llame a este método desde Apex programado. Sin embargo, si su Apex programado ejecuta un trabajo por lotes, las llamadas son compatibles con la clase por lotes.

P. ¿Cuáles son las limitaciones de Apex programado?

1. Podemos programar solo 100 trabajos a la vez.
2. Max no. El número de trabajos programados de ápice en 24 horas es de 2,50 000 número de trabajos (puede cambiar con las actualizaciones de Salesforce).
3. Las llamadas de servicios web síncronos no son compatibles con Apex programable.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/01/intermediate-to-advance-level-interview-questions-on-schedulable-apex.html#utm_source=rss&utm_medium=rss&utm_campaign=intermediate-to-advance-level-interview-questions-on-schedulable-apex

Categories
Developers Salesforce

Preguntas de la entrevista en profundidad sobre los objetos y la relación de Salesforce

P. ¿Podemos establecer el campo propietario en el objeto de detalle?

El campo Propietario del objeto de detalle no está disponible y se establece automáticamente en el propietario de su registro maestro asociado.

P. ¿Podemos permitir la re-crianza en la relación maestro-detalle de forma predeterminada?

De forma predeterminada, los registros no se pueden volver a crear en relaciones maestro-detalle . Sin embargo, los administradores pueden permitir que los registros secundarios en las relaciones maestro-detalle en objetos personalizados se vuelvan a comparar con diferentes registros principales seleccionando la opción Permitir reparenting en la definición de la relación maestro-detalle.

P. ¿Puede el objeto estándar estar en el lado de los detalles de la relación con el objeto personalizado?

El objeto estándar no puede estar en el lado de los detalles de una relación con un objeto personalizado.

P. ¿Para qué objetos estándar podemos tener una relación maestro-detalle?

No podemos crear una relación maestro-detalle en la que los objetos Usuario o Cliente potencial sean el maestro.

P. ¿Cuál es el efecto del objeto maestro primario en el objeto de unión?

  • Apariencia: las páginas de edición y detalle del objeto de unión utilizan el color y cualquier icono asociado del objeto principal principal.
  • Propiedad del registro: los registros del objeto de unión heredan el valor del campo Propietario de su registro maestro principal asociado . Debido a que los objetos en el lado del detalle de una relación no tienen un campo Propietario visible, esto solo es relevante si luego borra ambas relaciones maestro-detalle en su objeto de unión.
  • División: si su organización utiliza divisiones para segmentar datos, los registros de objeto de unión heredan su división de su registro maestro principal asociado. De manera similar a la propiedad del registro, esto solo es relevante si luego elimina ambas relaciones maestro-detalle.

P ¿Qué sucede si elimina el detalle principal principal o lo convierte en una búsqueda en muchos -many?

Si elimina la relación principal principal-detalle o la convierte en una relación de búsqueda, el objeto principal secundario se convierte en principal.

P. ¿Podemos tener una relación de búsqueda de maestro a objeto de unión para muchas a muchas relaciones?

P. ¿Podemos convertir maestro-detalle en una relación de búsqueda?

Puede convertir una relación maestro-detalle en una relación de búsqueda siempre que no existan campos de resumen acumulados en el objeto maestro.

P. Cuando convertimos la relación maestro-detalle en la búsqueda de un objeto personalizado en el lado del detalle, ¿qué sucede con el OWD de ese objeto?

Al convertir una relación maestro-detalle en una búsqueda de un objeto personalizado en el lado «detalle», cambia el valor predeterminado de toda la organización para el objeto a lectura / escritura pública .

P. ¿Podemos convertir la búsqueda en una relación de detalle maestro?

Puede convertir una relación de búsqueda en una relación maestro-detalle si el campo de búsqueda en todos los registros contiene un valor.

P. Cuando convertimos la búsqueda en la relación maestro-detalle de un objeto personalizado en el lado de los detalles, ¿qué sucede con el OWD de ese objeto?

La conversión de una búsqueda en una relación maestro-detalle cambia el valor predeterminado de toda la organización a Controlado por los padres y el modelo de uso compartido se actualiza a lectura / escritura pública.

P. ¿Explica las relaciones con uno mismo?

Puede crear una relación de un objeto a sí mismo, pero debe ser una relación de búsqueda y un solo registro no se puede vincular a sí mismo. Sin embargo, un registro puede relacionarse indirectamente consigo mismo.

Por ejemplo, la campaña Promoción de vacaciones puede tener la campaña de correo directo seleccionada en la relación de búsqueda y la campaña de correo directo puede tener seleccionada la campaña de promoción de vacaciones en la relación de búsqueda.

P: ¿Cuáles son las consideraciones para la relación maestro-detalle multinivel?

Para crear relaciones maestro-detalle multinivel, necesita el permiso de usuario «Personalizar aplicación».

Puede tener hasta tres niveles de detalle personalizados.

Un objeto puede aparecer una vez en relaciones maestro-detalle multinivel.

Las relaciones maestro-detalle multinivel no admiten transferencias de división.

Puede utilizar relaciones maestro-detalle de varios niveles en tipos de informes personalizados.

Los tipos de informes personalizados creados para relaciones maestro-detalle multinivel cuentan para el límite de tipos de informes personalizados de la organización y no se generan informes si se excede este límite.

P. Si el objeto personalizado ya contiene los datos, ¿cómo podemos establecer una relación maestro-detalle?

No puede crear una relación maestro-detalle si el objeto personalizado ya contiene datos. Sin embargo, puede crear la relación como una búsqueda y luego convertirla en detalles maestros si el campo de búsqueda en todos los registros contiene un valor.

P: ¿Puede el objeto de unión personalizado convertirse en maestro en una relación maestro-detalle multinivel?

El objeto de unión personalizado no puede convertirse en el objeto maestro en una relación maestro-detalle de varios niveles.

P. ¿Podemos eliminar el objeto personalizado en el lado maestro de la relación maestro-detalle?

No puede eliminar un objeto personalizado si está en el lado principal de una relación principal-detalle.

P. ¿Qué sucede si eliminamos un objeto personalizado en el lado del detalle de la relación maestro-detalle?

Si elimina un objeto personalizado que está en el lado del detalle de una relación maestro-detalle, la relación se convierte en una relación de búsqueda.

Eliminar un registro de detalle lo mueve a la Papelera de reciclaje y deja el registro maestro intacto

P. Si borra un registro de detalle y luego borra el registro maestro en la relación maestro-detalle. Más tarde, recupera el registro maestro y luego, ¿qué sucede?

Si borra un registro de detalle y luego, por separado, borra su registro maestro, no puede recuperar el registro de detalle, ya que ya no tiene un registro maestro con el que relacionarse.

P. ¿Qué sucede cuando se elimina cualquiera de los objetos maestros en muchas o muchas relaciones?

Los registros de objetos de unión se eliminan cuando se elimina cualquier registro maestro asociado y se coloca en la Papelera de reciclaje.

Si se eliminan ambos registros maestros asociados, el registro del objeto de unión se elimina de forma permanente y no se puede restaurar.

P. En muchas a muchas relaciones, ¿qué objeto maestro controla el uso compartido del objeto de unión?

El acceso compartido a un registro de objeto de unión está determinado por el acceso compartido de un usuario a los registros maestros asociados y la opción Configuración de uso compartido en el campo de relación.

P. ¿Qué sucede cuando intentamos eliminar el registro principal si hay más de 200 objetos de unión asociados a él?

En una relación de varios a varios, un usuario no puede eliminar un registro principal si hay más de 200 registros de objetos de unión asociados a él.

si el objeto de unión tiene un campo de resumen acumulativo que se acumula en el otro padre. Para eliminar este objeto, elimine manualmente los registros del objeto de unión hasta que el recuento sea inferior a 200.

P. ¿Podemos crear un resumen acumulativo en el maestro secundario en una relación de muchos a muchos?

Los campos de resumen acumulados que resumen los datos del objeto de unión se pueden crear en ambos objetos maestros.

Puede definir desencadenadores de Apex tanto en objetos maestros como en el objeto de unión.

P. ¿Puede el objeto de unión estar en el lado maestro de cualquier relación maestro-detalle?

Un objeto de unión no puede estar en el lado principal de otra relación principal-detalle.

P ¿Cuáles son las consideraciones al eliminar a un padre?

No se permite eliminar un registro que tiene registros secundarios, excepto cuando los registros secundarios se eliminan temporalmente (se envían a la Papelera de reciclaje). Si todos los registros secundarios de un registro principal se eliminan temporalmente, el registro principal se elimina. Además, todos los elementos secundarios eliminados temporalmente se eliminan de la papelera de reciclaje y se eliminan permanentemente.

P. En el escenario donde el campo A es la búsqueda de destino del campo B, que a su vez es la búsqueda de destino del campo C, puede especificar que A puede eliminar B, pero B no se puede eliminar porque está en una relación con C. Si intentas borrar A, ¿qué pasará?

Si intenta eliminar A, obtendrá un error que indica que B no se puede eliminar porque está vinculado a C.

P. Si se elimina el registro principal en la relación de búsqueda, ¿qué se muestra en el campo de seguimiento del historial del registro secundario?

Si se elimina el registro principal en una relación de búsqueda, el seguimiento del historial de campo para el registro secundario no registra la eliminación. Por ejemplo, si se elimina una cuenta principal, la lista relacionada Historial de la cuenta de la cuenta secundaria no muestra la eliminación.

P. ¿Qué tipo de relación admiten los objetos externos?

Solo las relaciones de búsqueda, búsqueda externa y búsqueda indirecta están disponibles para objetos externos. No se admiten otros tipos de relaciones.

P. ¿Está disponible la eliminación en cascada en los objetos externos?

La eliminación en cascada no está disponible para las relaciones de objetos externos.

P. ¿Qué sucede con los informes personalizados cuando se convierte una relación de búsqueda a detalle maestro o viceversa?

Convertir una relación de búsqueda a maestro-detalle o viceversa puede hacer que los informes personalizados existentes se vuelvan inutilizables debido a los diferentes tipos de informes estándar disponibles para cada tipo de relación.

Le recomendamos que pruebe sus informes personalizados inmediatamente después de convertir el tipo de relación. Si revierte su relación al tipo original, los informes se restauran y se pueden volver a utilizar.

P: ¿Existe algún objeto estándar que también actúe como objeto de unión?

Sí, hay algunos objetos estándar que actúan como un objeto de unión.

Por ejemplo, el objeto estándar OpportunityContactRole actúa como un objeto de unión entre los objetos Opportunity y Contact.

P. ¿Qué son los objetos externos?

Los objetos externos son similares a los objetos personalizados en Salesforce, pero los datos del registro de objetos externos se almacenan fuera de su organización de Salesforce. Los datos almacenados en sistemas externos como Oracle, SAP, Heroku Postgres, etc. Cada objeto externo está asociado con una definición de fuente de datos externa en su organización de Salesforce. Una fuente de datos externa especifica cómo acceder a un sistema externo.

  • Cada organización puede tener hasta 100 objetos externos . Los objetos externos no cuentan para la cantidad de objetos personalizados.

Al usar objetos externos, no tiene que administrar una copia de esos datos en Salesforce, por lo que no está desperdiciando almacenamiento y recursos manteniendo los datos sincronizados y puede acceder a los datos a pedido.

Los objetos externos se utilizan mejor cuando tiene una gran cantidad de datos que no puede o no desea almacenar en su organización de Salesforce, y necesita usar solo una pequeña cantidad de datos a la vez.

cada objeto externo termina con » __x «.

EJEMPLO

Si sincroniza el objeto Cuenta de la organización del proveedor, la organización del suscriptor crea:

  • Un objeto externo con el nombre de API Account__x
  • Campos personalizados, incluido uno con el nombre de API Name__c

Si sincroniza el objeto CustObj__c de la organización del proveedor, la organización del suscriptor crea:

  • Un objeto externo con el nombre de API CustObj_c__x
  • Campos personalizados, incluido uno con el nombre de API Name__c

Si el objeto de la organización del proveedor tiene un campo personalizado, la organización del suscriptor crea el campo personalizado en el objeto externo equivalente, por ejemplo:

  • MyCustField_c__c
  • MyOtherCustField_c__c

Si sincroniza el objeto externo Account__x de la organización del proveedor, la organización del suscriptor crea:

  • Un objeto externo con el nombre de API Account_x__x
  • Campos personalizados, incluido uno con el nombre de API Name_c__c

Los objetos externos están disponibles con Salesforce Connect y Files Connect . Cada objeto externo está asociado con una definición de fuente de datos externa en su organización de Salesforce.

P. ¿Qué es una fuente de datos externa?

Una fuente de datos externa especifica cómo acceder a un sistema externo . Salesforce Connect utiliza fuentes de datos externas para acceder a los datos almacenados fuera de su organización de Salesforce.

Files Connect utiliza fuentes de datos externas para acceder a sistemas de contenido de terceros . Las fuentes de datos externas tienen objetos externos asociados, que sus usuarios y la Plataforma Lightning utilizan para interactuar con los datos y el contenido externos.

Al acceder a los datos de registro a pedido, los objetos externos siempre reflejan el estado actual de los datos externos. No tiene que administrar una copia de esos datos en Salesforce, por lo que no está desperdiciando almacenamiento y recursos manteniendo los datos sincronizados.

Los objetos externos se utilizan mejor cuando tiene una gran cantidad de datos que no puede o no desea almacenar en su organización de Salesforce, y necesita usar solo una pequeña cantidad de datos a la vez.

P. ¿Qué es la búsqueda externa?

Una relación de búsqueda externa vincula un objeto secundario, personalizado o externo con un objeto externo principal.

Los valores del campo ID externo estándar en el objeto externo principal se comparan con los valores del campo de relación de búsqueda externa. Para un objeto externo secundario, los valores del campo de relación de búsqueda externa provienen del Nombre de columna externa especificado.

Página de detalles del registro de objeto externo con el objeto estándar Lista relacionada con la cuenta y el objeto externo Lista relacionada Sales_Order

P. ¿Qué es la búsqueda indirecta?

Una relación de búsqueda indirecta vincula un objeto externo secundario a un objeto estándar o personalizado principal. Cuando crea un campo de relación de búsqueda indirecta en un objeto externo, especifica el campo del objeto principal y el campo del objeto secundario para que coincidan entre sí.

P. ¿Qué es un objeto grande?

Un gran objeto almacena y gestiona grandes cantidades de datos en la plataforma Salesforce . Puede archivar datos de otros objetos o llevar conjuntos de datos masivos de sistemas externos a un gran objeto para obtener una vista completa de sus clientes . Los clientes y los sistemas externos utilizan un conjunto estándar de API para acceder a los datos de Big Object. Un objeto grande proporciona un rendimiento constante, ya sea que tenga 1 millón de registros, 100 millones o incluso mil millones. Esta escala le da a un objeto grande su poder y define sus características.

P: ¿Cuáles son los tipos de objetos grandes?

Hay dos tipos de objetos grandes.

  • Grandes objetos estándar: objetos definidos por Salesforce e incluidos en los productos de Salesforce. Los objetos grandes estándar están disponibles de fábrica y no se pueden personalizar.
  • Grandes objetos personalizados: nuevos objetos que crea para almacenar información exclusiva de su organización. Por ejemplo, si está creando una aplicación para rastrear el inventario de productos, cree un objeto grande personalizado llamado HistoricalInventoryLevels para rastrear los niveles históricos de inventario para análisis y optimizaciones futuras

P. ¿Cuáles son algunos casos de uso de objetos grandes personalizados?

  • Vista de 360 ° del cliente: amplíe su modelo de datos de Salesforce para incluir información detallada de programas de lealtad, feeds, clics, información de facturación y aprovisionamiento, y más.
  • Auditoría y seguimiento: realice un seguimiento y mantenga una visión a largo plazo del uso de Salesforce o del producto con fines de análisis o cumplimiento.
  • Archivo histórico: mantenga el acceso a los datos históricos para fines de análisis o cumplimiento mientras optimiza el rendimiento de sus aplicaciones centrales de CRM o plataforma Lightning.

P. ¿Cuáles son las diferencias entre los objetos grandes y otros objetos?

Debido a que un objeto grande puede almacenar datos en una escala ilimitada, tiene características diferentes a otros objetos, como sObjects. Los objetos grandes también se almacenan en una parte diferente de la plataforma Lightning.

Objetos grandes sObjects
Base de datos distribuida escalable horizontalmente Base de datos relacional
Base de datos no transaccional Base de datos transaccional
Cientos de millones o incluso miles de millones de registros Millones de registros
  • Los objetos grandes solo admiten permisos de objetos y campos, no reglas de uso compartido estándar o estándar .
  • Las funciones como disparadores, flujos, procesos y la aplicación móvil Salesforce no son compatibles con los objetos grandes.
  1. ¿Qué tipo de objetos grandes son?
  • Objetos grandes estándar : los define Salesforce y se incluyen en los productos de Salesforce. Ej .: FieldHistoryArchive (que le permite almacenar hasta 10 años de datos de historial de campo archivados)
  • Objetos grandes personalizados : no puede crear objetos grandes a través de la interfaz de usuario estándar de Salesforce. Sin embargo, puede crear objetos grandes siguiendo dos formas.
  1. Mediante el uso de la API de metadatos : Usted define e implementa los Big Objects personalizados a través de la API de metadatos. Para definir un objeto grande personalizado, crea un archivo de objeto que contiene su definición, campos e índice, junto con un conjunto de permisos para definir los permisos para cada campo y un archivo de paquete para definir el contenido de los metadatos del objeto. Después de insertar el archivo de metadatos a través del banco de trabajo, puede verificar que el nombre de la API de Big Object termine con «__b» en org .
  2. Creador de Big Object personalizado : Hay otra forma de crear Big Object mediante la instalación del paquete administrado «Custom Big Object Creator » de Salesforce Labs. Podemos crear Big Object usando la pestaña Lightning del creador de Big Object personalizado. En Big Objects OWD, CRUD, la seguridad de nivel de campo se puede configurar según el requisito. Como estos objetos se utilizan para almacenamiento, solo admitirá 5 tipos de datos que son » Texto, área de texto largo, fecha y hora, número y búsqueda «
  1. ¿Cómo puedo insertar registros en Big Objects?

Hay diferentes formas de crear un registro de BigObject, como usar un archivo csv, usar API como Bulk API o incluso Async SOQL o database.insertImmediate (record) apex method

Usando la API REST:

Puede insertar los datos en el objeto utilizando el método de publicación rest api a través del banco de trabajo:

«/Service/Data/v40.0/sObjects/CustomObjHistory__b»

Puede exponer los datos utilizando la página de fuerza visual o el componente Lightning.

Q. ¿Cómo podemos consultar objetos grandes?

Si sabemos que está consultando una pequeña cantidad de registros, puede usar SOQL

Y la otra forma es » Async SOQL »

AsyncSOQL : para administrar millones y millones de registros en sus grandes objetos personalizados, Salesforce presentó AsyncSOQL. Pero Async SOQL se incluye solo con la licencia de capacidad adicional de big object

P: ¿Cuáles son algunas de las consideraciones sobre objetos grandes?

  • Puede crear solo 100 objetos grandes por organización. Los límites para los campos de objetos grandes son similares a los límites de los objetos personalizados y dependen del tipo de licencia de su organización.
  • Big Objects solo admite seguridad a nivel de objeto y campo
  • Los Big Objects se pueden utilizar en el análisis de Einstein, pero no para el generador de informes y la búsqueda.
  • No podemos rastrear el historial de campo en Big Objects
  • Big Objects no admite transacciones que incluyen grandes objetos, objetos estándar y objetos personalizados.
  • No puede escribir disparadores, flujos, procesos en objetos grandes.
  • No puede utilizar objetos externos de Salesforce Connect para acceder a objetos grandes en otra organización.
  • La mejor práctica al escribir en un objeto grande es tener un mecanismo de reintento. (Por ejemplo, vuelva a intentar el lote hasta que obtenga un resultado exitoso de la API o el método Apex)
  • Puede eliminar los datos en Big Objects usando el método de vértice “deleteImmediate ()”.

P. ¿Cuándo usar Salesforce Connect?

  1. Cuando Acceso en tiempo real a los datos más recientes: ambos sistemas se mantienen sincronizados con los datos en tiempo real
  2. Cuando el sistema externo es confiable: Cuando el sistema externo es, Sistema de registro y casi libre de mantenimiento
  3. Operación CRUD bidireccional: para sincronizar los datos entre 2 sistemas wrt Crear / Actualizar / Eliminar
  4. Cuando el sistema externo tiene millones de datos: cuando está integrando otro sistema a Salesforce y no necesita replicar una cantidad sustancial de datos.

P: ¿Cuáles son algunas consideraciones relacionadas con el objeto externo?

  • Los datos de Extrenal no se almacenan en Salesforce y se accederá a ellos cuando ejecutemos el informe.
  • Cuando ejecuta un informe, Salesforce realiza una llamada de solicitud al objeto externo
  • Los informes de tendencias históricas y los campos de depósitos y depósitos no son compatibles con los informes de objetos externos
  • Si el informe incluye campos de resumen y fórmulas, esos valores agregados reflejan solo un subconjunto de sus datos. Para mejorar la precisión de los valores agregados, intente personalizar el informe para obtener datos más relevantes
  • El informe puede recuperar hasta 2000 registros si tiene objetos secundarios, el total de registros puede ser mayor o menor que 2000 según la cantidad de registros secundarios obtenidos.
  • No se admiten los campos Fórmula y Resumen de lista completa.
  • No se admite el seguimiento del historial de campo.
  • No se admiten notas ni archivos adjuntos.
  • Los metadatos de objetos externos son controlados por un sistema externo.
  • No es compatible con Salesforce Automations.

10,000 llamadas de OData por hora para las ediciones Enterprise, Performance y Unlimited.

P: ¿Qué es Salesforce Connect?

Salesforce Connect es un marco de trabajo estándar de Salesforce que le permite crear, ver, editar, eliminar y buscar datos fuera de Salesforce (fuentes externas), ya sea en las instalaciones o en la nube, o desde Salesforce.

Para obtener acceso a los datos en tiempo real almacenados en un sistema externo, es necesario crear una fuente de datos externa en Salesforce.

Configuración -> Fuente de datos externa -> Nueva fuente de datos externa

Q. ¿Qué pasará si recuperamos el objeto de unión y el objeto normal de la papelera de reciclaje?

Los tipos de datos Master – Detail Relación se convertirán para buscar tipos de datos de relación.

Si recuperamos cualquier objeto de la papelera de reciclaje, entonces toda la relación de detalle maestro se cambiará a la relación de búsqueda.

P: ¿Cuáles son los campos indexados predeterminados en Salesforce?

Tenemos algunos campos que están indexados por defecto en Salesforce, que son:

  • Nombre
  • IDENTIFICACIÓN
  • Campos de propietario
  • Campos de relación maestro-detalle
  • Campos de búsqueda
  • Últimas fechas de modificación
  • Fechas de auditoría

P. ¿Qué son los objetos de configuración?

Los objetos de configuración son aquellos que interactúan con los metadatos. Todos los demás objetos (estándar y personalizados) son objetos que no son de configuración.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/04/interview-questions-on-salesforce-objects-and-relationship.html#utm_source=rss&utm_medium=rss&utm_campaign=interview-questions-on-salesforce-objects-and-relationship

Categories
Developers Salesforce

Preguntas de la entrevista sobre uso compartido y seguridad en Salesforce

P. ¿Qué es un grupo de conjuntos de permisos?

Grupos de conjuntos de permisos es una función que permite a los administradores combinar varios conjuntos de permisos en un solo grupo de conjuntos de permisos para la asignación de usuarios. Con el mecanismo de agrupación, los administradores pueden aplicar verdaderamente el control de acceso basado en roles para administrar los derechos de los usuarios en las organizaciones de Salesforce.

P. ¿Qué es el conjunto de permisos personalizados?

Actualmente, en Salesforce tenemos muchas funciones que requieren verificaciones de acceso que especifican qué usuarios pueden acceder a determinadas funciones. Sin embargo, los conjuntos de permisos y los perfiles no incluyen el acceso a algunos procesos y aplicaciones personalizados. Los permisos personalizados le permiten definir comprobaciones de acceso que se pueden asignar a los usuarios a través de conjuntos de permisos o perfiles, de manera similar a cómo asigna permisos de usuario y otras configuraciones de acceso. Por ejemplo, puede definir comprobaciones de acceso en Apex que hacen que un botón en una página de Visualforce esté disponible solo si un usuario tiene el permiso personalizado apropiado. En cualquier momento, el administrador puede revocar el permiso personalizado del perfil o conjunto de permisos para revocar el acceso a la aplicación del procesador.

La siguiente lógica representa el bloque de página según el permiso personalizado.

<apex: pageBlock renderizado = ”{! $ Permiso. Opportunity_Stage_Edit} ”>

</ apex: pageBlock>

P ¿Cómo activar la regla de uso compartido del campo Fórmula?

La regla de uso compartido no le permite usar campos de fórmula en los criterios de la regla, pero la solución es reemplazar el campo de fórmula con un campo regular y colocar la fórmula que lo completa en un flujo de trabajo que se activa cada vez que se crea o edita un objeto. Tendremos un campo regular con el mismo valor.

ejemplo: hay una ciudad (campo de fórmula) en el objeto Student_c y debemos usarla en los criterios que cuando Ciudad = ‘Delhi’ se comparta con el rol de Soporte de ventas. Ahora, como no podemos acceder al campo de fórmula en la regla de uso compartido, crearemos otro campo en el objeto del estudiante, digamos CityValue. Ahora crearemos un flujo de trabajo que siempre que City (formulaField) = ‘Delhi’, luego fieldUpdate CityValue (TextField) a ‘Delhi’. Luego acceda al campo CityValue en la regla Compartir.

P. ¿Es posible omitir el acceso Conceder acceso mediante jerarquías en el caso de objetos estándar?

No

P. ¿El objeto personalizado en el lado de los detalles puede tener una regla para compartir?

Los objetos personalizados en el lado de los detalles de una relación maestro-detalle no pueden tener reglas de uso compartido, uso compartido manual o colas, ya que requieren el campo Propietario.

P. ¿Por qué no puedo encontrar la lista de campos de Cuenta personal en la configuración de Seguridad de nivel de campo (FLS) cuando navego a los campos en Objeto de cuenta?

La seguridad de nivel de campo (FLS) de los campos de la cuenta personal se controla mediante los campos de contacto. Por lo tanto, si desea configurar el FLS de los campos de cuenta personal, navegue a los campos de contacto y se reflejará en la cuenta personal.

P: Tipos de reglas para compartir, ¿cuántas hay?

Las reglas de uso compartido se utilizan para abrir el acceso al registro de Salesforce.

La regla de uso compartido funciona si el registro OWD es privado o público de solo lectura

Cuando se ejecuta la regla de uso compartido, Salesforce crea un registro detrás de escena para compartir obect

No podemos compartir los registros con el usuario directamente. Necesitamos agregar usuarios al grupo público para compartir registros.

Hay tres tipos de reglas para compartir:

  • Regla de uso compartido basada en el propietario
  • Regla de uso compartido basada en criterios. No puede utilizar Apex para crear reglas de intercambio basadas en criterios. Además, el uso compartido basado en criterios no se puede probar con Apex.
  • Acceso de usuario invitado, según criterios

Puede compartir registro con:

  • Grupo público
  • Roles
  • Colas
  • Roles y subordinados internos
  • Roles, portal y subordinados internos

P: ¿Explique Apex Sharing?

Para acceder a compartir mediante programación , debe utilizar el objeto compartido asociado con el objeto estándar o personalizado para el que desea compartir. Por ejemplo, AccountShare es el objeto compartido para el objeto Cuenta, ContactShare es el objeto compartido para el objeto Contacto. Además, todos los objetos de uso compartido de objetos personalizados se denominan de la siguiente manera, donde MyCustomObject es el nombre del objeto personalizado:

MyCustomObject__Share

Un objeto compartido incluye registros que admiten los tres tipos de uso compartido:

compartir gestionado

uso compartido administrado por el usuario

Uso compartido administrado por Apex

P. ¿Cuáles son algunas consideraciones para el uso compartido administrado de Apex?

Solo los usuarios con el permiso «Modificar todos los datos» pueden agregar o cambiar el uso compartido administrado de Apex en un registro

P. ¿Cuáles son las consideraciones de compartir objetos?

Los objetos en el lado de los detalles de una relación maestro-detalle no tienen un objeto compartido asociado.

No podemos crear el objeto «__share» por ti mismo. El sistema lo crea por nosotros. Si la configuración para compartir de un objeto es «Lectura / escritura pública», el sistema no creará el objeto «__share», ya que no hay un alcance para compartir, todos los registros están abiertos para todos en la organización. Sin embargo, si la configuración de uso compartido del objeto es «Público de solo lectura» o «Privado», el sistema crea un objeto «__share» para nosotros.

P. El objeto de caso tiene OWD configurado como privado. Ahora, independientemente de las jerarquías, como de arriba hacia abajo (por ejemplo, el gerente puede ver los casos de clientes potenciales), de abajo hacia arriba (por ejemplo, el cliente potencial puede ver los casos de los jefes) y horizontal (por ejemplo, el cliente potencial puede ver los casos de clientes potenciales) y de forma transversal, todos los casos deben ser visibles. a cualquier persona sin cambios en OWD. ¿Cómo es esto posible?

Cree una regla de uso compartido basada en criterios en la que otorgue acceso a «Roles y subordinados» al jefe de departamento, esto permitirá que todos accedan al caso independientemente de la jerarquía.

P: ¿Es posible crear reglas de uso compartido para el objeto de detalle?

No, podemos crear reglas de uso compartido para objetos de detalles porque no tienen un campo de propietario.

P. ¿Cuáles son las propiedades del objeto compartido?

objectNameAccessLevel: el nivel de acceso que se le ha otorgado al usuario o grupo especificado para un sObject compartido

Los valores válidos son:

• Editar

• Leer

• Todas

ParentID: el ID del objeto. Este campo no se puede actualizar.

RowCause: el motivo por el que se concede acceso al usuario o grupo . El motivo determina el tipo de intercambio , que controla quién puede alterar el registro de intercambio . Este campo no se puede actualizar.

UserOrGroupId: los ID de usuario o grupo a los que está otorgando acceso . Un grupo puede ser:

• Un grupo público o un grupo de uso compartido asociado con un rol.

• Un grupo territorial.

P. ¿Cuáles son algunas de las consideraciones para compartir el ápice?

Los objetos en el lado de los detalles de una relación maestro-detalle no tienen un objeto compartido asociado. El acceso al registro de detalles está determinado por el objeto de uso compartido del maestro y la configuración de uso compartido de la relación.

P: ¿En qué modo se ejecuta Apex?

Apex generalmente se ejecuta en el contexto del sistema ; es decir, los permisos del usuario actual y la seguridad a nivel de campo no se tienen en cuenta durante la ejecución del código. Sin embargo, las reglas de uso compartido no siempre se omiten: la clase debe declararse con la palabra clave sin compartir para garantizar que no se apliquen las reglas de uso compartido.

Las únicas excepciones a esta regla son el código Apex que se ejecuta con la llamada executeAnonymous y Connect en Apex. executeAnonymous siempre se ejecuta con todos los permisos del usuario actual. Para obtener más información sobre executeAnonymous, consulte Bloques anónimos.

P: ¿Qué efecto tiene el hecho de compartir en el permiso del usuario y FLS?

Hacer cumplir las reglas de uso compartido mediante el uso de la palabra clave with sharing no impone los permisos del usuario ni la seguridad a nivel de campo. El código Apex siempre tiene acceso a todos los campos y objetos de una organización, lo que garantiza que el código no deje de ejecutarse debido a campos u objetos ocultos para un usuario.

P: ¿Cómo aplicar FLS a nivel de objeto en Apex?

Apex no aplica los permisos a nivel de objeto ni a nivel de campo de forma predeterminada, puede aplicar estos permisos en sus consultas SOQL mediante WITH SECURITY_ENFORCED.

También puede aplicar permisos a nivel de objeto y de campo en su código llamando explícitamente a los métodos de resultado de descripción de sObject (de Schema.DescribeSObjectResult) y al método de resultado de descripción de campo (de Schema.DescribeFieldResult ) que verifican los niveles de permisos de acceso del usuario actual. De esta manera, puede verificar si el usuario actual tiene los permisos necesarios, y solo si tiene los permisos suficientes, puede realizar una operación DML específica o una consulta.

Por ejemplo, puede llamar a los métodos isAccessible, isCreateable o isUpdateable de Schema.DescribeSObjectResult para verificar si el usuario actual ha leído, creado o actualizado el acceso a un sObject, respectivamente .

Para verificar el permiso de actualización a nivel de campo del campo de correo electrónico del contacto antes de actualizarlo:

  1. if (Schema.sObjectType.Contact.fields.Email.isUpdateable ()) {
  2. // Actualizar el número de teléfono de contacto
  3. }

Para verificar el permiso de creación a nivel de campo del campo de correo electrónico del contacto antes de crear un nuevo contacto:

  1. if (Schema.sObjectType.Contact.fields.Email.isCreateable ()) {
  2. // Crear nuevo contacto
  3. }

Para verificar el permiso de lectura a nivel de campo del campo de correo electrónico del contacto antes de consultar este campo:

  1. if (Schema.sObjectType.Contact.fields.Email.isAccessible ()) {
  2. Contact c = [SELECT Email FROM Contact WHERE Id =: Id];
  3. }

Para comprobar el permiso a nivel de objeto para el contacto antes de eliminarlo:

  1. if (Schema.sObjectType.Contact.isDeletable ()) {
  2. // Borrar contacto
  3. }

P: ¿Cuál es el uso de stripInaccessible?

Utilice el método stripInaccessible para hacer cumplir la protección de datos a nivel de campo y de objeto . Este método se puede utilizar para quitar los campos y los campos de relación de los resultados de consultas y subconsultas a los que el usuario no puede acceder. El método también se puede utilizar para eliminar campos sObject inaccesibles antes de las operaciones DML para evitar excepciones y desinfectar sObjects que se han deserializado de una fuente que no es de confianza.

La verificación de acceso se basa en el permiso a nivel de campo del usuario actual en el contexto de la operación especificada: crear, leer, actualizar o actualizar. El método stripInaccessible comprueba los registros de origen en busca de campos que no cumplan con la comprobación de seguridad a nivel de campo del usuario actual. El método también verifica los registros de origen en busca de campos de búsqueda o de relación maestro-detalle a los que el usuario actual no tiene acceso. El método crea una lista de retorno de sObjects que es idéntica a los registros de origen, excepto que se eliminan los campos que son inaccesibles para el usuario actual.

P: ¿stripInaccessible es compatible con el objeto AggregateResult?

El método stripInaccessible no es compatible con AggregateResult SObject. Si los registros de origen son del tipo AggregateResult SObject, se lanza una excepción.

P: ¿Cómo recalcular el uso compartido administrado por ápice?

Para volver a calcular el uso compartido administrado de Apex, debe escribir una clase de Apex para realizar el nuevo cálculo. Esta clase debe implementar la interfaz Database.Batchable proporcionada por Salesforce.

La interfaz Database.Batchable se utiliza para todos los procesos de Apex por lotes, incluido el recalculado del uso compartido administrado de Apex.

Para este ejemplo, suponga que está creando una aplicación de contratación y tiene un objeto llamado Trabajo. Desea validar que el reclutador y el gerente de contratación que figuran en el trabajo tienen acceso al registro. La siguiente clase de Apex realiza esta validación. Este ejemplo requiere un objeto personalizado llamado Trabajo, con dos campos de búsqueda asociados con registros de usuario llamados Hiring_Manager y Recruiter. Además, el objeto personalizado Trabajo debe tener dos razones para compartir agregadas llamadas Hiring_Manager y Recruiter. Antes de ejecutar esta muestra, reemplace la dirección de correo electrónico con una dirección de correo electrónico válida a la que desea enviar notificaciones de error y notificaciones de finalización del trabajo.

P: ¿Qué es el uso compartido administrado por el usuario?

En el uso compartido administrado por el usuario, un usuario que tiene acceso completo al registro comparte los registros con otros, pero cuando se cambia el propietario del registro, este registro se eliminará de la tabla de uso compartido. De manera similar , cuando el intercambio de ápice se define como «Manual» en RowCause, eliminará el registro de la tabla de intercambio cuando se cambie el propietario del registro.

Para resolver este problema, necesitamos definir Apex Sharing Reason en Rowcause mientras escribimos Apex Sharing.

ápice de salesforce

Código de ejemplo:

¿Qué es Salesforce Apex?

Dado que hemos definido Apex Sharing Reason en el uso compartido de objetos personalizados, mantendrá actualizados los registros de la tabla Share siempre que se cambie el propietario del registro. Por lo tanto, el usuario aún autorizado puede acceder a los registros sin ningún problema.

P: ¿Explique el uso compartido de Apex para objetos estándar?

Los objetos estándar no son compatibles con Apex Sharing Reason . Por lo tanto, al compartir registros de objetos estándar, de forma predeterminada debe definir RowCause como «Manual».

clase ápice en salesforce

P. El objeto de caso tiene OWD configurado como privado. Ahora, independientemente de las jerarquías, como de arriba hacia abajo (por ejemplo, el gerente puede ver los casos de clientes potenciales), de abajo hacia arriba (por ejemplo, el cliente potencial puede ver los casos de los jefes) y horizontal (por ejemplo, el cliente potencial puede ver los casos de clientes potenciales) y de forma transversal, todos los casos deben ser visibles. a cualquier persona sin cambios en OWD. ¿Cómo es esto posible?

Cree una regla de uso compartido basada en criterios en la que otorgue acceso a «Roles y subordinados» al jefe de departamento, esto permitirá que todos accedan al caso independientemente de la jerarquía.

¿Cuáles son los escenarios en los que podemos usar sin compartir?

Sin compartir

1. Si tenemos una página de LWC en la que estamos mostrando «Rendimiento del representante de ventas», que muestra una bandera en rojo, verde y amarillo. Ahora bien, lo ideal es que este campo no esté visible siempre que un Representante de ventas acceda a esta página. Pero siempre es visible si la clase no tiene una palabra clave especificada o si una clase tiene sin compartir especificado.

¿Cuáles son las consideraciones al usar con compartir?

  • Si la clase no se declara como Con compartir o Sin compartir, la clase se toma por defecto como Sin compartir.
  • Tanto las clases internas como las externas se pueden declarar como Con uso compartido.
  • Si la clase interna se declara como With Sharing y la clase de nivel superior se declara como Sin compartir, entonces, de forma predeterminada, todo el contexto se ejecutará en With Sharing Context.
  • Si una clase no se declara como Con / Sin compartir y si esta clase es llamada por otra clase en la que se aplican las reglas de uso compartido, ambas clases se ejecutan con Con uso compartido.
  • La clase externa se declara como With Sharing y la clase interna se declara como Without Sharing, luego la clase interna se ejecuta solo en el contexto Sin compartir (la clase interna no toma las propiedades de Sharing de la clase externa).

P: ¿Cuál es la diferencia entre el uso compartido gestionado por ápice y el uso compartido?

Apex Managed Sharing se utiliza para otorgar acceso a los registros . Se trata de configurar de manera programática las reglas para compartir. La palabra clave «Con uso compartido» se utiliza para respetar la regla actual de uso compartido del usuario.

P: ¿Cuáles son las consideraciones al utilizar el uso compartido administrado por Apex?

  • Si el propietario del registro cambia , el uso compartido creado a través del uso compartido administrado por ápice se mantiene, pero si el usuario comparte el registro manualmente , el uso compartido de registros se perderá si el propietario cambia.
  • El usuario con «modificar todos los datos» solo puede agregar, editar o eliminar registros en la tabla de compartir.

P: ¿Cuáles son las limitaciones del uso compartido manual?

  • El uso compartido manual no puede ser más estricto que los valores predeterminados de toda la organización.
  • El uso compartido manual solo está disponible en registros individuales, no está disponible para todos los registros de un determinado objeto.
  • Solo se aplica a los registros que tienen acceso público o privado de solo lectura en OWD.
  • Al configurar el uso compartido automático y manual, los usuarios y administradores deben definir si la seguridad debe extenderse a los registros relacionados.
  • ¿Qué es Con compartir y sin compartir?
  • Con uso compartido: significa «con la configuración de seguridad aplicada». Si declara una clase como Con uso compartido, las reglas de uso compartido proporcionadas al usuario actual se tendrán en cuenta. Esto se refiere únicamente a respetar los OWD y las Reglas de uso compartido. No podemos aplicar «automáticamente» la seguridad a nivel de campo o los permisos de perfil con «con compartir»,
  • Ejemplo
  • público con compartir clase sharingClass
  • Sin compartir: si declara una clase como Sin compartir, esta clase de Apex se ejecuta en modo de sistema, lo que significa que el código de Apex tiene acceso a todos los objetos y campos independientemente de las reglas de uso compartido de los usuarios actuales, la seguridad de nivel de campo y los permisos de Objeto.

P. ¿Diferencia entre rol y perfil?

  • Los perfiles ayudan a controlar los privilegios de objetos como CRED (Crear, Leer, Editar, Eliminar). También contienen permisos del sistema que un usuario puede realizar, como exportar datos.
  • Los roles ayudan a compartir registros en una organización. Funcionan de forma jerárquica, dando a los usuarios acceso a registros que son propiedad de personas más bajas en la jerarquía.
  • Un usuario solo puede tener un único perfil y rol asignado.

P: ¿Diferencia entre grupo público y cola?

  • Las colas se utilizan cuando asignamos un registro a un grupo de usuarios. Con la ayuda de las colas podemos asignar un registro a múltiples usuarios (usando colas) para que cualquier miembro de la cola pueda trabajar en el registro. También permite a los usuarios tener vistas separadas.
  • Se utiliza para equilibrar la carga.
  • Se puede crear para objetos personalizados y para casos, clientes potenciales y versiones de artículos de conocimiento.
  • Ejemplo:
  • Escenario de la vida real
  • Hay muchos ejecutivos de atención al cliente en un centro de llamadas y muchos clientes llaman a la vez y un ejecutivo puede hablar con un cliente a la vez, por lo que las llamadas de otros clientes se mantienen en colas. Cada usuario debe tener asignado al menos un cliente potencial y el mismo número de clientes potenciales.
  • Lo mismo ocurre en Salesforce:
  • El usuario debe manejar el cliente potencial asignado individualmente y todos los usuarios de la organización deben tener asignado el mismo número de clientes potenciales, en este caso podemos definir usuarios en la organización como Cola y asignarlos uno por uno y en el mismo número mediante la asignación de clientes potenciales por turnos.

Los grupos públicos son usuarios relacionados con el equipo o el grupo, que se utilizan para compartir datos. No son los propietarios de los registros (como la cola), pero pueden compartir los registros (en términos de acceso).

El grupo público se puede crear en cualquier objeto.

QA puede ver los datos B pero B no puede ver los datos A. ¿Por qué?

  • Verifique las siguientes condiciones
  • 1 – ¿Ambos usuarios tienen el mismo perfil?
  • 2. Compruebe la jerarquía de roles de A y B.
  • 3. Marque la regla de uso compartido

P. ¿Qué es TOTP?

TOTP es una contraseña de un solo uso basada en el tiempo. Podemos utilizar el flujo de inicio de sesión que mejora la autenticación TOTP con un método de autenticación de dos factores que admite Salesforce. El algoritmo TOTP calcula una contraseña de un solo uso a partir de una clave secreta compartida y la hora actual.

Los usuarios pueden utilizar una aplicación de autenticación basada en el tiempo (como Salesforce Authenticator o Google Authenticator) para escanear el código QR y generar un token TOTP.

P. ¿Qué es Con compartir y sin compartir?

Con uso compartido: significa «con la configuración de seguridad aplicada». Si declara una clase como Con uso compartido, las reglas de uso compartido proporcionadas al usuario actual se tendrán en cuenta. Esto se refiere únicamente a respetar los OWD y las Reglas de uso compartido. No podemos aplicar «automáticamente» la seguridad a nivel de campo o los permisos de perfil con «con compartir»,

Ejemplo

público con compartir clase sharingClass

Sin compartir: si declara una clase como Sin compartir, esta clase de Apex se ejecuta en modo de sistema, lo que significa que el código de Apex tiene acceso a todos los objetos y campos independientemente de las reglas de uso compartido de los usuarios actuales, la seguridad de nivel de campo y los permisos de Objeto.

P: El usuario A tiene el botón CLONAR visible en Cuentas, el Usuario B no puede ver el botón CLONAR en Cuentas. ¿Por qué?

Verifique las siguientes condiciones

1 – ¿Ambos usuarios tienen el mismo perfil?
2 – No hay ningún conjunto de permisos personalizados asignado a ningún usuario
3 – ¿Tiene tipos de registro para el objeto de cuenta y diseños de página asociados para esos tipos de registro?
4 – Ha verificado el diseño de la página y el botón Clonar se agrega al Diseño de página.

P: Tenemos 2 usuarios A y B con el mismo perfil y función. ¿Cómo podemos restringir los registros de A a B y viceversa?

En el conjunto de perfiles Ver todos los datos y modificar todos los permisos de fecha a ‘falso’. Esto restringirá el acceso del usuario a los datos creados por otros usuarios.

P. Hay 100 usuarios. ¿90 usuarios pueden leer registros, 10 usuarios pueden actualizar registros?

Crea dos perfiles:

El primer perfil otorga permiso de lectura y agrega 90 usuarios.

El segundo perfil otorga permiso de lectura y edición y agrega 10 usuarios.

P. ¿Cuáles son los tipos de OWD?

Privado

Solo lectura pública

Lectura y escritura pública

Lectura / escritura / transferencia pública

P. ¿Cuáles son las limitaciones del modelo OWD?

OWD reduce el acceso. No se puede abrir el acceso

P. Hay cinco usuarios bajo un perfil y solo un usuario ve todos los datos. La cuenta es privada. ¿Por qué?

Cree un conjunto de permisos con ver todos los accesos a las cuentas y asigne un conjunto de permisos a un usuario específico

P. ¿Qué es SAML?

Security Assertion Markup Language (SAML) es un estándar abierto que permite el inicio de sesión único (SSO). Al hacer que una variedad de recursos sea accesible con un solo conjunto de credenciales de inicio de sesión, puede proporcionar un acceso sin problemas a los recursos y eliminar la proliferación de contraseñas inseguras.

SAML habilita específicamente la federación de identidades, lo que hace posible que los proveedores de identidad (IdP) pasen de manera transparente y segura identidades autenticadas y sus atributos a los proveedores de servicios (SP).

P. ¿Qué es OWD y por qué es necesario?
OWD es el valor predeterminado de toda la organización. Se utiliza para seguridad a nivel de registro. Es seguridad básica. Proporciona el acceso más restrictivo para el registro y luego podemos abrirlo con jerarquía de roles, regla de uso compartido, uso compartido manual.
Público Acceso completo.
La opción de acción completa pública está disponible para configurar el objeto de campaña únicamente. A través del acceso público, el usuario puede tener la capacidad de buscar registros, informes y registros, agregar registros relacionados, editar detalles del registro y eliminar el registro.
Lectura / Escritura / Transferencia
La opción de lectura / escritura / transferencia solo está disponible para clientes potenciales y casos. Aquí podemos configurar Privado, Público Rad solamente, Público Lectura / Escritura y público / Lectura / Escritura / Transferencia para casos y objetos principales. Cuando los objetos de caso y cliente potencial se establecen en público / Lectura / Escritura / Transferencia, todos los usuarios pueden ver, editar, transferir e informar sobre todos los casos y registros de clientes potenciales.
Lectura / escritura pública.
Cuando un registro se establece en lectura / escritura pública, el usuario puede ver, editar e informar sobre todos los registros.
Solo lectura pública.
Cuando un registro se establece como público de solo lectura, el usuario puede buscar los registros, ver e informar sobre cada registro, pero el usuario no puede editar ese registro. Los propietarios y usuarios de registros pueden editar esos registros.
Privado.
Cuando un registro se configura como privado, solo el propietario del registro y los usuarios superiores a los roles en una jerarquía pueden ver, editar e informar sobre esos registros.
Sin acceso, solo visualización, uso.
Esta opción Sin acceso, Ver solo, Usar solo está disponible para las listas de precios. Podemos establecer el nivel de acceso para la configuración de OWD del libro de precios en Sin acceso, solo ver o usar.
 El uso es el nivel de acceso predeterminado para la lista de precios y permite a los usuarios acceder a la información de la lista de precios y pueden usar esa información de la lista de precios en oportunidades con productos.
 Ver solo permite a los usuarios acceder a la información de la lista de precios y no utilizar esa información en oportunidades con productos.
 Sin acceso restringe a los usuarios el acceso a la información y los precios de la lista de precios.

P: ¿Qué es el cifrado de plataforma Shield?

Shield Platform Encryption brinda a sus datos una nueva capa de seguridad al tiempo que preserva la funcionalidad crítica de la plataforma. Le permite cifrar datos confidenciales en reposo y durante la transmisión a través de la red .

Shield Platform Encryption se basa en las opciones de cifrado de datos que Salesforce ofrece de forma inmediata. Los datos almacenados en muchos campos estándar y personalizados y en archivos y adjuntos se cifran mediante un sistema avanzado de derivación de claves basado en HSM , por lo que están protegidos incluso cuando otras líneas de defensa se han visto comprometidas.

Su clave de cifrado de datos nunca se guarda ni se comparte entre organizaciones. En su lugar, se deriva a pedido de un secreto maestro y el secreto de inquilino específico de su organización, y se almacena en caché en un servidor de aplicaciones.

P. ¿Cómo rastreamos si el campo está encriptado o no?

Si es un usuario autorizado para acceder al registro, los datos se mostrarán normalmente en el registro. Entonces, ¿cómo podemos rastrear si los campos están encriptados o no? Lo primero que podemos hacer es comprobar la información archivada de Workbench

  1. WorkBench : puede iniciar sesión en Workbench

Información-> Objeto estándar y personalizado -> Seleccione el objeto

Luego expanda la carpeta Campos -> Seleccione el campo que ha cifrado. En detalle, obtendrá cifrado en verdadero.

  1. Destruyendo la clave del inquilino: si destruye la clave del inquilino, verá directamente el resultado de los campos cifrados a nivel de registro. Para obtener acceso autorizado nuevamente a los campos cifrados, importe la clave de inquilino.

Estadísticas de cifrado:

Las estadísticas de cifrado le proporcionarán un informe completo sobre la cantidad de datos cifrados por Shield Platform Encryption y la cantidad de datos cifrados por un secreto de inquilino activo.

Configuración -> Cifrado de plataforma -> Estadísticas de cifrado

P. ¿Diferencia entre el cifrado clásico y el cifrado de escudo?

Con Shield Platform Encryption, puede cifrar una variedad de campos estándar ampliamente utilizados, junto con algunos campos personalizados y muchos tipos de archivos. Shield Platform Encryption también admite cuentas personales, casos, búsqueda, procesos de aprobación y otras funciones clave de Salesforce. El cifrado clásico le permite proteger solo un tipo especial de campo de texto personalizado, que crea para ese propósito.

P: ¿Qué es compartir implícitamente?

El intercambio implícito es automático . No puede apagarlo ni encenderlo, es nativo de la plataforma.

El uso compartido implícito de los padres proporciona acceso de solo lectura a los registros de los padres (solo cuenta), cuando el usuario tiene acceso al registro de los niños, como: oportunidades, casos o contactos para esa cuenta. Esto no significa que el usuario deba ser el registro propiedad del registro secundario.

Cuando el usuario tiene acceso a un registro de otros objetos (NO oportunidad, caso o contacto) que tienen una búsqueda en la Cuenta, el usuario verá solo el Nombre de la Cuenta, pero no accederá a los detalles de la Cuenta ; esto incluye la búsqueda de la Cuenta en la Cuenta Principal, secundaria el propietario de la cuenta solo verá el nombre de la cuenta principal.

El uso compartido implícito de niños es la capacidad del propietario de la cuenta para acceder a los registros secundarios (contactos, oportunidades y casos), incluso si no son propiedad del propietario de la cuenta. La función del propietario de la cuenta determina el nivel de acceso a los registros secundarios (solo lectura o lectura / escritura).

P: ¿Qué es System.RunAs?

Generalmente, todo el código Apex se ejecuta en modo de sistema, donde no se tienen en cuenta los permisos y el uso compartido de registros del usuario actual. El método del sistema runAs nos permite escribir métodos de prueba que cambian el contexto del usuario a un usuario existente o un nuevo usuario para que se aplique el uso compartido de registros del usuario.

El método runAs no impone permisos de usuario o permisos de nivel de campo, solo uso compartido de registros. Podemos usar runAs solo en métodos de prueba.

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/04/interview-question-on-sharing-and-security-in-salesforce.html#utm_source=rss&utm_medium=rss&utm_campaign=interview-question-on-sharing-and-security-in-salesforce

Categories
Developers Salesforce

Preguntas de la entrevista sobre SOQL en Salesforce

P. ¿Cómo recuperar todos los campos en la consulta SOQL?

En Spring 21, Salesforce traerá una función a través de la cual podemos buscar todos los campos en SOQL Query.

Ahora tenemos CAMPOS (TODOS), CAMPOS (ESTÁNDAR) y CAMPOS (PERSONALIZADO) que podemos usar en la consulta SOQL.

  • CAMPOS (TODOS) : recupera todos los campos de un objeto. Esto es similar a Seleccionar * de SQL.
  • CAMPOS (ESTÁNDAR) : recupera todos los campos estándar de un objeto.
  • CAMPOS (PERSONALIZADO) : recupera todos los campos personalizados de un objeto.

Así es como se verá la consulta:

List <Contact> allConatcts = [SELECCIONAR CAMPOS (TODOS) DEL LÍMITE DE CONTACTO 200];

En las subconsultas, se verá así:

Lista <Cuenta> allAccounts = [

SELECT Account.Name, (SELECT FIELDS (ALL) FROM Account.Contacts LIMIT 200)

De la cuenta

];

69. ¿Qué es una consulta acotada y no acotada?

Cuando la API no puede determinar el conjunto de campos por adelantado , considerará la consulta como Consulta ilimitada .

si la API puede determinar el conjunto de campos de antemano, entonces es Consulta limitada .

Por ejemplo, el número de campos personalizados para un objeto no está predeterminado, por lo que los CAMPOS (PERSONALIZADO) y los CAMPOS (TODOS) se consideran consultas ilimitadas.

P. ¿Qué es la herramienta Query Plan?

Query Plan en la consola del desarrollador puede ayudar a acelerar las consultas SOQL realizadas en grandes volúmenes de datos. Esta es una herramienta tan poderosa cuando se trata de un mal desempeño. El desarrollador puede utilizar esta herramienta para optimizar y acelerar las consultas SOQL.

P. ¿Cómo prevenir las inyecciones SOQL?

Hay una serie de técnicas que puede utilizar para evitar la inyección de SOQL:

Consultas estáticas con variables de enlace

String.escapeSingleQuotes ()

Tipo de fundición

Reemplazo de personajes

Lista blanca

P. ¿Cuáles son los tipos de declaraciones SOQL en SalesForce?

Hay 2 tipos de declaraciones SOQL:

  1. SOQL estático
  2. SOQL dinámico

P. ¿Qué es Static SOQL?
La instrucción SOQL estática se escribe entre corchetes de matriz [].
Estas declaraciones son similares a LINQ
Por ejemplo :

string searchfor = ‘Sfdcamplified’;

Contacto [] Contactos = [SELECCIONE xyz__c, Nombre, Apellido DESDE el Contacto DONDE Apellido =: buscar];

P. ¿Qué es SOQL dinámico?

Dynamic SOQL se refiere a la creación de una cadena SOQL en tiempo de ejecución con código Apex . Dynamic SOQL le permite crear aplicaciones más flexibles. Por ejemplo, puede crear una búsqueda basada en la entrada de un usuario final o actualizar registros con diferentes nombres de campo. Esta es la principal diferencia entre soql y soql dinámico.

SOQL dinámico:
– Se utiliza para hacer referencia a la colección de una cadena SOQL en tiempo de ejecución con el código apex.
– Dynamic SOQL le permite crear una aplicación más flexible.
Para crear una consulta SOQL dinámica en tiempo de ejecución, utilice el método Database.Query (), de una de las siguientes formas.
– Devuelve un solo sObject cuando la consulta devuelve un solo registro.
– Por ejemplo: sObject s = Database.query (string_limit_1)
– Devuelve una lista de sObject cuando una consulta devuelve más de un registro.
Por ejemplo :

string myTestString = ‘TestName’;
List <sObject> sl = Database.query (SELECT Id, Name FROM myCustomObject__c WHERE Name =: myTestString);

Database.query (query_string) puede invocar SOQL dinámico; donde query_string es la consulta generada en tiempo de ejecución. En funcionamiento y procesamiento, funciona igual que los SOQL estáticos.

Ejemplo :

List <Contact> conList = Database.query (‘SELECT Id, Name

DE contacto

DONDE nombre = ‘James’ ‘);

P. ¿Cuál es la desventaja de Dynamic SOQL?

Una DESVENTAJA con DYNAMIC SOQL es que provoca una inyección de SOQL en la condición que se obtiene sobre la base de algún texto. Para evitarlo, debemos usar String.escapeSingleQuotes. No hay posibilidad de estos en Static SOQL.

P. ¿Cuáles son algunas de las consideraciones clave de Dynamic Query?

  • Los errores en tiempo de compilación no se generan al guardar una consulta dinámica.
  • Debe tener mucho cuidado para evitar errores en tiempo de ejecución .
  • El SOQL dinámico también puede causar posibles amenazas a la seguridad a través de la inyección de SOQL . Un usuario malintencionado podría pasar intencionalmente algunos caracteres que pueden recuperar más resultados SOQL de los que pretendía. Si debe utilizar SOQL dinámico, utilice el método escapeSingleQuotes para desinfectar la entrada proporcionada por el usuario. Este método agrega el carácter de escape () a todas las comillas simples en una cadena que se pasa de un usuario. El método garantiza que todas las comillas simples se traten como cadenas adjuntas, en lugar de como comandos de la base de datos.

P. ¿Qué son los SOSL dinámicos?
Con Dynamic SOSL, el desarrollador puede crear una declaración SOSL en tiempo de ejecución, lo que permite crear aplicaciones más flexibles.

La instrucción SOSL dinámica devuelve una lista de listas de sObjects, donde cada lista contiene el resultado de la búsqueda para un tipo de sObject en particular. Los resultados se almacenarán en el mismo orden en que se especifican los sObjects en la consulta SOSL dinámica. La SOSL dinámica no se puede usar donde se puede usar una SOSL en línea, como en asignaciones regulares y bucles for.

Dynamic SOSL también tiene los mismos límites reguladores que las declaraciones de SOSL estáticas.

P: ¿Cuándo usamos database.query ()?
database.query le permite realizar una consulta SOQL dinámica en tiempo de ejecución. Puede crear una cadena y luego usarla como una cadena de consulta en tiempo de ejecución en la base de datos.
instrucción de consulta para realizar una llamada SOQL que se determina en tiempo de ejecución.
El método database.query debe usarse en instancias en las que desee realizar una consulta SOQL dinámica en tiempo de ejecución para su código.

P: ¿cuándo usamos database.getquerylocator ()?
database.getQueryLocator devuelve un localizador de consultas que ejecuta la lista de devolución de consultas SOQL seleccionada que se puede iterar en el ápice por lotes o se puede usar para mostrar conjuntos grandes en VF (lo que permite cosas como la paginación).

Métodos de QueryLocator
Los siguientes son métodos para QueryLocator. Todos son métodos de instancia.
getQuery ()
Devuelve la consulta utilizada para crear una instancia del objeto Database.QueryLocator. Esto es útil cuando se prueba el método de inicio.
iterador ()
Devuelve una nueva instancia de un iterador de localizador de consultas.

El localizador de consultas puede devolver hasta 50 millones de registros y debe utilizarse en los casos en los que desee recopilar un gran volumen de datos.

P. ¿Cuál es el uso de la cláusula order by en soql?
A. Utilice el ORDER BY opcional en una instrucción SELECT de una consulta SOQL para controlar el orden de los resultados de la consulta, como comenzar alfabéticamente con z.
Si los registros son nulos, puede utilizar ORDER BY para mostrar los registros vacíos en primer o último lugar.
Puede utilizar ORDER BY en una instrucción SELECT para controlar el orden de los resultados de la consulta. No hay garantía del orden de los resultados a menos que utilice una cláusula ORDER BY
en una consulta.
Sintaxis: [ORDER BY fieldOrderByList {ASC | DESC} [NULLS {FIRST | LAST}]]

P. ¿Qué es OFFSET en soql?
R. La compensación se utiliza para omitir las filas desde el inicio de la consulta.
consideraciones de compensación:

1. el límite máximo de compensación es de 2000 filas. solicitar un desplazamiento mayor que 2000 resultará en un error de rango válido de número fuera del lado.
2. offset no se puede utilizar en subconsultas en la cláusula where.

P. ¿Qué es LIMIT en soql?
La cláusula de límite se utiliza para restringir el número de filas que devolverá el soql. La declaración de límite debe ser la última declaración en la consulta soql

sintaxis: [seleccione ID, nombre, industria del límite de la cuenta 1]

Nota:
si desea usar el límite y la compensación juntos, tenemos que usar el límite seguido de la compensación

P. ¿Cuántos registros se pueden recuperar usando SOQL?
R. podemos recuperar hasta 50000 registros de SOQL en una sola transacción.
Si queremos obtener más de 50000 registros por SOQL, debería considerar el uso de Batch Apex para lograr sus objetivos.
No puede recuperar más de 50.000 registros de sus llamadas SOQL en un solo contexto. Sin embargo, con Batch Apex su lógica se procesará en trozos de entre 1 y 200 registros en un lote.

P. ¿Sintaxis para recuperar los registros de la papelera de reciclaje usando soql?
A. SELECT Id, isDeleted FROM <Oblectname> WHERE isDeleted = true All ROWS – Esto solo devolverá las filas eliminadas.
SELECT Id, isDeleted FROM <Oblectname> WHERE isArchived = true All ROWS – Esto solo devolverá las filas archivadas.
SELECT Id, isDeleted FROM <Oblectname> All ROWS: esto devolverá los registros eliminados, los registros archivados y los registros que no se eliminaron ni archivaron (conjunto de datos idéntico al devuelto por un SOQL que no usa TODAS LAS FILAS) también.

No puede utilizar TODAS LAS FILAS y FOR UPDATE juntas.

P. ¿Nombrar algunas funciones de fecha en soql?
A. Palabras clave DATE y TIME
HOY:
AYER:
ESTA SEMANA
LA PRÓXIMA SEMANA
LA SEMANA PASADA
lo mismo que para el mes y el año
LAST_N_WEEK: N
NEXT_N_WEEK: N
lo mismo que para el mes, los días, el año

Métodos FECHA y HORA:

calender_month ()
calender_quarter ()
calender_year ()
Día del mes()
Day_week ()
Día año()
Day_Only ()

P. ¿Qué es la cláusula FOR UPDATE en soql?
R. La cláusula For Update bloqueará los registros para que no se actualicen desde otras transacciones hasta que se complete la transacción actual.
sintaxis: [select id, name from account for update]

P. ¿Qué es la cláusula LIKE en soql?
A. La cláusula like se usa para comparar los valores de la cadena o se usa para buscar el valor de la cadena en los campos dados
‘%’ – cualquier número de caracteres
‘_’ – un carácter

sintaxis: [seleccione apellido, nombre, teléfono del contacto donde apellido LIKE ‘% s’]

P: ¿Cómo utilizar Datetime en Dynamic SOQL Query en Salesforce?

// formatea la fecha y hora para que esté lista para Dynamic Soql

String formatedDt = cutOffDateTime.format (‘aaaa-MM-dd’T’HH: mm: ss’Z ”);

String sql = ‘SELECT ID FROM Covid_Answer__c DONDE covid_Test_Result__r.Patient_Name__r.IsActive__c = false AND LastModifiedDate <‘ + formatedDt;

P. ¿Cómo se puede utilizar el campo de fecha y hora como criterio en la consulta SOQL?
Respuesta:

No podemos usar la fecha y hora como condición en la cláusula Where entre Cotizaciones individuales.
Puedes hacer algo como esto

DONDE Fecha de creación> 2005-10-08T00: 00: 00Z

O también puede usar Literales de fecha como

DONDE Fecha de creación> AYER

P. El registro de oportunidad tiene el campo de moneda denominado «Importe de oportunidad». Necesitamos obtener el Importe de la oportunidad en función de la moneda del usuario mencionada en su registro de usuario.

Para obtener la cantidad de oportunidad según la moneda del usuario, podemos usar las funciones Format () y convertCurrency () en SOQL.

Format () : esta función se puede usar en la instrucción de selección SOQL para formatear los campos de fecha, hora y moneda según la configuración regional del usuario.

convertCurrency () : esta función también se puede utilizar en la instrucción de selección SOQL para convertir los campos de moneda a la moneda del usuario.

El uso de las dos funciones anteriores aquí es la declaración SOQL:

SELECCIONAR Nombre, MonedaIsoCode, Monto, FORMATO (convertCurrency (monto)) ConvertedinUserCurrency

FROM Opportunity DONDE Nombre = ‘Generador de planta de tejido de textiles de Burlington’

P: Seleccione la identificación de la cuenta TODAS LAS FILAS. ¿Cuál es el resultado de la consulta?

Las declaraciones SOQL pueden usar las palabras clave ALL ROWS para consultar todos los registros de una organización, incluidos los registros eliminados y las actividades archivadas.

  1. System.assertEquals (3, [SELECT COUNT () FROM Contact WHERE AccountId = a.Id TODAS LAS FILAS]);

Puede usar TODAS LAS FILAS para consultar registros en la Papelera de reciclaje de su organización. No puede utilizar las palabras clave ALL ROWS con las palabras clave FOR UPDATE.

P. ¿Cuál es la diferencia entre dónde y tener?

  • La cláusula WHERE filtra registros en una consulta SOQL que no tiene función agregada.
  • La cláusula HAVING filtra los resultados después de que una función agregada agregue los datos.

P: ¿Cuál es la diferencia entre SOSL y SOQL?

SOQL (lenguaje de consulta de objetos de Salesforce) SOSL (lenguaje de búsqueda de objetos de Salesforce)
Solo se puede buscar un objeto a la vez Se pueden buscar muchos objetos a la vez
Puede consultar cualquier tipo de campo Solo puede realizar consultas por correo electrónico, mensaje de texto o teléfono
Se puede usar en clases y disparadores. Se puede usar en clases, pero no desencadenantes.
La operación DML se puede realizar en los resultados de la consulta La operación DML no se puede realizar en los resultados de búsqueda
Registros de devoluciones Campos de devoluciones

P. ¿Explique los diferentes operadores que se utilizan en SOQL?

Y Utilice Y para devolver registros que cumplan dos condiciones. Esta consulta devuelve todos los registros que tienen el nombre Stella y el apellido Pavlova.

SELECCIONAR Nombre, Correo electrónico
DE Contacto
DONDE FirstName = ‘Stella’ Y LastName = ‘Pavlova’

O Utilice OR para devolver registros que cumplan una de dos condiciones. Esta consulta devuelve registros con el apellido James o el apellido Barr.

SELECCIONAR Nombre, Correo electrónico
DE Contacto
DONDE Apellido = ‘James’ O Apellido = ‘Barr’

EN Utilice IN para devolver registros que cumplan al menos una de tres o más condiciones. La cláusula IN se usa comúnmente para devolver los valores de una lista de selección o valores de LIST o SET. IN simplifica una consulta que de otro modo tendría muchas condiciones OR. Esta consulta devuelve todos los registros que tienen el apellido James, Barr, Nedaerk o Forbes.

SELECCIONE nombre, correo electrónico de contacto
DONDE Apellido IN (‘James’, ‘Barr’, ‘Nedaerk’, ‘Forbes’)

ASC Devuelve los resultados en orden ascendente SELECCIONE nombre, correo electrónico de contacto
PEDIR POR Nombre ASC
LÍMITE 5
DESC Devuelve los resultados en orden descendente SELECCIONE nombre, correo electrónico de contacto
PEDIR POR CORREO ELECTRÓNICO DESC
LÍMITE 5
NULOS

PRIMERO | ÚLTIMO

Devuelve registros nulos al principio (NULLS FIRST) o al final (NULLS LAST) SELECCIONE nombre, correo electrónico de contacto
PEDIR POR Email
NULOS ÚLTIMOS

P. ¿Explicar la consulta de padre a hijo y de hijo a padre?

Consulta de hijo a padre

En una consulta de hijo a padre, consulta el objeto hijo y obtiene campos de un objeto padre mediante el uso de notación de puntos, como este:

Por ejemplo: SELECT Name, Account.Name FROM Contact

Consulta de padre a hijo

En una consulta de padre a hijo, usamos una subconsulta para obtener campos del objeto hijo. Una subconsulta es una instrucción SELECT entre paréntesis y anidada dentro de otra consulta.

Consulta principal (para cada cuenta, devuelva el nombre de la cuenta) y Subconsulta (el nombre de cada contacto relacionado).

Dentro de una subconsulta, en lugar del nombre del campo del objeto relacionado, usamos el nombre de la relación secundaria

SELECCIONE Nombre, (SELECCIONE Nombre DE Contactos) DE Cuenta. Subconsulta: SELECCIONAR Nombre DE Contactos

La ventana Resultados de la consulta muestra los nombres de las cuentas y una colección de registros de contactos secundarios asociados con cada cuenta. Este tipo de colección probablemente le resulte familiar porque hablamos de mapas

P. ¿Escribir una consulta de muestra para objetos personalizados de hijo a padre?

Broker__r es el nombre de la relación personalizada.

SELECCIONE Dirección__c, Imagen__c, Agente__r.Nombre DE Propiedad__c

P. ¿Escribir una consulta de muestra para objetos personalizados de padre a hijo?

El nombre de la relación secundaria es Propiedades. Debido a que esta es una relación personalizada, cuando la usamos en una consulta, agregamos __r (Propiedades__r). Entonces nuestra subconsulta (entre paréntesis) es:

SELECCIONAR Nombre, (SELECCIONAR Dirección__c, Precio__c DE Propiedades__r) DE Broker__c

P. Solo queremos cuentas que tengan un contacto relacionado con el apellido Forbes. ¿Cómo funciona la consulta?

SELECCIONE Nombre, (SELECCIONE Nombre DE Contactos) DE Cuenta DONDE ID EN (SELECCIONE ID de Cuenta DE Contacto DONDE Apellido = ‘Forbes’)

    1. La consulta busca contactos con el apellido Forbes y devuelve el valor del campo AccountId de cada contacto. (La subconsulta de la cláusula WHERE hace eso).
    2. A continuación, busca el valor de ese AccountId en el campo Id de una cuenta y obtiene el nombre de esa cuenta. (La cláusula principal WHERE hace eso).
    3. Luego, la consulta examina los contactos relacionados con la cuenta y obtiene el nombre de cada contacto. (La subconsulta de la consulta principal hace eso).
    4. Finalmente, la consulta principal devuelve el nombre de cada cuenta que tiene un contacto relacionado con el apellido Forbes, y para cada una de esas cuentas, los nombres de todos los contactos relacionados.

P. ¿Qué es la variable de vinculación?

Una variable de vinculación es una variable de Apex que utiliza en una consulta SOQL. Utilice las variables de vinculación como marcadores de posición para los valores específicos que se proporcionarán más adelante.

Integer maxHomeValue = 200000;

Lista <Property__c> propiedad = [SELECT Name, Price__c FROM Property__c WHERE Price__c <: maxHomeValue];

consulta, la variable de vinculación está precedida por dos puntos (:).

El uso de vincular variables en la cláusula WHERE le permite establecer valores de variable en su código antes de que se ejecute la consulta. Las variables de enlace hacen que una consulta sea dinámica. Para personalizar una consulta para cada usuario, establezca los valores de las variables de enlace según la entrada del usuario.

P. ¿Qué son las funciones agregadas?

Función agregada Descripción Ejemplo
CONTAR() Devuelve el número de filas asociadas con el campo. SELECCIONAR CONTADOR (Nombre)

FROM Broker__c

COUNT_DISTINCT () Devuelve el número de filas únicas que coinciden con los criterios de consulta. SELECT COUNT_DISTINCT (Ciudad__c)

DESDE Propiedad__c

MIN () Devuelve el valor mínimo de un campo. SELECT MIN (Days_On_Market__c)

DESDE Propiedad__c

MAX () Devuelve el valor máximo de un campo. SELECCIONAR MAX (Camas__c)

DESDE Propiedad__c

AVG () Devuelve el valor medio de un campo numérico. SELECT City__c, AVG (Days_On_Market__c)

DESDE Propiedad__c

GRUPO POR Ciudad__c

SUMA() Devuelve el valor total de un campo numérico. SELECCIONAR SUMA (Precio__c), Agente__r. Nombre

DESDE Propiedad__c

GRUPO POR Broker__r.Name

P. ¿Explique Agrupar por?

SELECCIONE MAX (Status__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name

esta consulta agrupa las propiedades por intermediario. Para las propiedades de cada corredor, enumeramos el valor Status__c más avanzado. Ese es el valor de la lista de selección de estado más cercano al valor de la lista de selección final. Queremos corredores que hayan vendido propiedades, por lo que reduciremos aún más los resultados.

P. Explique ¿TENER?

SELECT MAX (Status__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name HAVING MAX (Status__c) = ‘Cerrado’

El uso de la cláusula HAVING reduce los resultados a propiedades con el estado Cerrado

    1. La cláusula WHERE filtra registros en una consulta SOQL que no tiene función agregada.
    2. La cláusula HAVING filtra los resultados después de que una función agregada agregue los datos.

P. ¿Qué pasará si usa queryMore en una consulta que tiene una función agregada?

Las consultas que incluyen una función agregada no admiten queryMore. Se produce una excepción en tiempo de ejecución si utiliza una consulta que contiene una función agregada que devuelve más de 2000 filas en un bucle for.

P: ¿Qué sucederá si se escribe una consulta SOQL en el bucle for para acceder a la respuesta del candidato de metadatos personalizados?

Llegará al límite del gobernador. Existe un límite regulador que impone un número máximo de consultas SOQL.
Cuando las consultas se colocan dentro de un bucle for, se ejecuta una consulta en cada iteración y se alcanza fácilmente el límite del gobernador.

P. ¿SOQL para bucles frente a consultas SOQL estándar?

La consulta SOQL a veces devuelve tantos sObjects que se excede el límite de tamaño del montón y se produce un error. Para resolverlo, utilice una consulta SOQL para bucle en su lugar, ya que puede procesar varios lotes de registros mediante llamadas internas para consultar y consultar Más.

Los desarrolladores siempre deben usar un bucle for SOQL para procesar los resultados de las consultas que devuelven muchos registros, para evitar el límite en el tamaño del montón.

P. ¿Explique SOQL For Loop?

Los bucles de SOQL for pueden procesar registros de uno en uno utilizando una única variable sObject, o en lotes de 200 sObjects a la vez utilizando una lista de sObject:

  • El formato único de sObject ejecuta el <code_block> del bucle for una vez por cada registro de sObject. En consecuencia, es fácil de entender y usar, pero es ineficiente si desea usar declaraciones de lenguaje de manipulación de datos (DML) dentro del cuerpo del bucle for. Cada instrucción DML termina procesando solo un sObject a la vez.
  • El formato de lista de sObjects ejecuta el <code_block> del bucle for una vez por lista de 200 sObjects . Es un poco más difícil de entender y usar, pero es la opción óptima si necesita usar declaraciones DML dentro del cuerpo del bucle for. Cada instrucción DML puede procesar de forma masiva una lista de sObjects a la vez.

P. ¿Qué es la relación polimórfica?

Una relación polimórfica es una relación entre objetos donde un objeto referenciado puede ser de varios tipos diferentes. Por ejemplo, el campo de relación Quién de una tarea puede ser un contacto o un cliente potencial.

Método 1: filtrar los resultados mediante el calificador de tipo.

Ejemplo: eventos relacionados con una cuenta u oportunidad a través del campo Qué.

  1. Lista <Evento> eventos = [SELECCIONAR Descripción DESDE Evento DONDE Qué. Escriba IN (‘Cuenta’, ‘Oportunidad’)]

Enfoque 2: Utilice la cláusula TYPEOF en la instrucción SOQL SELECT.

Ejemplo: Consultar eventos relacionados con una cuenta u oportunidad a través del campo Qué.

  1. Lista <Evento> eventos = [SELECCIONAR TIPO DE Qué CUANDO Cuenta ENTONCES Teléfono CUANDO Oportunidad ENTONCES Cantidad FINALIZA DEL Evento];

Estas consultas devuelven una lista de sObjects donde el campo de relación hace referencia a los tipos de objeto deseados.

P. ¿Cómo hacer el resultado de la lista Typecasting Database.query en el mapa?

String soqlQuery = ‘Seleccionar ID, nombre de cuenta’;

Map <Id, Account> accountMap = new Map <Id, Account> (

(Lista <Cuenta>) Database.query (soqlQuery)

);

System.debug (‘AccountMap-‘ + accountMap);

Referencia

Escenarios SOQL en Apex

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://www.sfdcamplified.com/2021/04/interview-questions-on-soql-in-salesforce.html#utm_source=rss&utm_medium=rss&utm_campaign=interview-questions-on-soql-in-salesforce