Skip to content

Etiqueta: Código Apex

Creación de prompts potentes para Einstein for Developers ☁️

Creación de prompts potentes para Einstein for Developers ☁️

Desbloquea todo el potencial de Einstein for Developers escribiendo prompts efectivas y bien enmarcadas para producir código Apex robusto.

El post Einstein for Developers

The post Escribiendo instrucciones eficaces para Einstein for Developers appeared first on Blog de desarrolladores de Salesforce.

Seguir leyendo

Desbloquee la inteligencia artificial para su código Apex con ApexGuru ☁️

Desbloquee la inteligencia artificial para su código Apex con ApexGuru ☁️

ApexGuru es una función basada en GenAI en Scale Center, diseñada para solucionar antipatrones y puntos conflictivos en implementaciones de Salesforce.

The post Obtenga información potenciada por IA para su código Apex con ApexGuru appeared first on Blog de desarrolladores de Salesforce.

Seguir leyendo

Mejore los conocimientos de los usuarios con interacciones personalizadas para AppExchange App Analytics ☁️

Mejore los conocimientos de los usuarios con interacciones personalizadas para AppExchange App Analytics ☁️

Los partners ISV ya pueden utilizar interacciones personalizadas para AppExchange App Analytics con el fin de conocer cómo utilizan los clientes los paquetes gestionados.

The post Obtenga mejores perspectivas de los usuarios con interacciones personalizadas para AppExchange App Analytics appeared first on Blog de desarrolladores de Salesforce.

Seguir leyendo

El escudo de la seguridad: Evitar las descargas de datos con la clasificación de datos

El escudo de la seguridad: Evitar las descargas de datos con la clasificación de datos

Última actualización el 15 de noviembre de 2023 por Rakesh Gupta Big Idea or Enduring Question: ¿Cómo evitar la descarga de datos críticos a través de informes? Objetivos: Después de leer este blog, serás capaz de: Entender la Clasificación de Datos Configurar la Clasificación de Datos para Campos Entender la Seguridad de Transacciones Crear una Seguridad de Transacciones

El post El escudo de la seguridad: Prevenir la Descarga de Datos con la Clasificación de Datos appeared first on Campeón de la Automatización.

El Escudo de la Seguridad

Seguir leyendo

Uso de prueba de flujo versus clase de prueba para flujo en 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
Seguir leyendo

Creación de aplicaciones impulsadas por IA con LLM y Einstein ☁️

Creación de aplicaciones impulsadas por IA con LLM y Einstein ☁️

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.

Creación de aplicaciones impulsadas por IA con LLM y Einstein | Blog de desarrolladores de Salesforce

La IA generativa es la tecnología más transformadora desde Internet y revoluciona la forma en que creamos e interactuamos con la información. Para los desarrolladores, esto plantea nuevas preguntas: desde la práctica "¿Cómo puedo crear aplicaciones impulsadas por IA con modelos de lenguaje grandes (LLM)?" Más profundamente, “¿Cómo cambiará la IA generativa la naturaleza de las aplicaciones? ” Exploramos estas dos preguntas en esta publicación de blog.

¿Cómo creo aplicaciones impulsadas por IA con LLM?

Comencemos con la primera pregunta: "¿Cómo creo aplicaciones con LLM?" y explore tres opciones que comúnmente se consideran:

  1. Entrena tu propio modelo
  2. Personaliza un modelo de código abierto
  3. Utilice modelos existentes a través de API

Entrena tu propio modelo

Entrenar su propio modelo le brinda control total sobre los datos de los que aprende su modelo. Por ejemplo, puede entrenar un modelo con datos específicos de su industria. Un modelo entrenado con datos de un dominio específico generalmente será más preciso que un modelo de propósito general para casos de uso centrados en ese dominio. Si bien entrenar su propio modelo ofrece más control y precisión, puede que no siempre sea el mejor enfoque. Aquí hay algunas cosas para considerar:

  1. Tiempo y recursos: formar su propio LLM desde cero puede llevar semanas o incluso meses. Como punto de referencia, aunque es probable que su modelo sea mucho más pequeño, el modelo GPT-3 de OpenAI tardó 1,5 millones de horas de GPU en entrenarse.
  2. Experiencia: para entrenar su modelo, también necesitará un equipo de ingenieros especializados en aprendizaje automático (ML) y procesamiento del lenguaje natural (NLP).
  3. Seguridad de los datos: el poder de los LLM hace que sea tentador crear modelos que aprendan de todos sus datos, pero esto no siempre es lo correcto desde el punto de vista de la seguridad de los datos. Puede haber tensión entre la forma en que aprenden los LLM y la forma en que se implementan las políticas de seguridad de datos en su empresa. Los LLM aprenden de grandes cantidades de datos. ¡Cuantos más datos mejor! Sin embargo, con seguridad a nivel de campo (FLS) y permisos estrictos, las políticas de seguridad de datos corporativas a menudo se basan en el principio de privilegio mínimo: los usuarios solo deben tener acceso a los datos que necesitan para realizar su trabajo específico. ¡Cuantos menos datos mejor! Por lo tanto, un modelo formado con todos los datos disponibles de los clientes y puesto a disposición de todos en su empresa puede no ser una buena idea y violar las políticas de seguridad de datos de su empresa. Sin embargo, un modelo entrenado en especificaciones de productos y resoluciones de tickets de soporte anteriores puede ayudar a los agentes a resolver tickets nuevos sin comprometer la seguridad de los datos.

Personaliza un modelo de código abierto

Personalizar un modelo de código abierto normalmente lleva menos tiempo y es menos costoso que entrenar su propio modelo desde cero. Sin embargo, aún necesita un equipo de ingenieros especializados en aprendizaje automático (ML) y procesamiento del lenguaje natural (NLP). Dependiendo del caso de uso, es posible que aún experimentes la tensión de seguridad de los datos descrita anteriormente.

Utilice modelos existentes a través de API

Utilizar modelos existentes a través de API es la forma más sencilla de crear aplicaciones con LLM. Esta es también la opción más utilizada en este momento. Sin embargo, estos modelos no se han entrenado con los datos contextuales o privados de su empresa y, por lo tanto, el resultado que producen puede ser demasiado genérico para ser útil.

En esta publicación de blog, exploramos diferentes técnicas para agregar datos contextuales o privados de la empresa a través del mensaje. Debido a que el mensaje se crea dinámicamente en nombre del usuario, solo incluye datos a los que el usuario tiene acceso, lo que aborda la tensión de seguridad de los datos descrita anteriormente. Es posible que le preocupe pasar datos privados a una API de terceros, pero existen técnicas para abordar esa preocupación y también las describimos en esta publicación de blog.

Creación de aplicaciones impulsadas por IA utilizando modelos existentes a través de API

Llamada API básica

Los principales proveedores de modelos como OpenAPI , Anthropic , Google , Hugging Face y Cohere ofrecen API para trabajar con sus modelos. En la implementación más básica, su aplicación captura un mensaje del usuario, lo pasa como parte de la llamada API y muestra el resultado generado al usuario.

Por ejemplo, así es como se vería la llamada API usando la API OpenAI:

Esta opción puede funcionar para casos de uso simples que solo requieren un resultado general basado en conocimientos generales. Por ejemplo, " Escribe un haiku sobre el invierno" o "Escribe una declaración SQL de muestra con una unión externa". Pero si necesita una respuesta que se adapte a su propio contexto o a los datos privados de su empresa, es probable que el resultado generado sea demasiado genérico para ser útil.

Por ejemplo, digamos que un usuario ingresa el siguiente mensaje:

Escriba un correo electrónico de presentación para el director ejecutivo de Acme.

El correo electrónico generado no sería personalizado ni relevante porque el modelo no sabe nada sobre su relación con Acme y los negocios que ha hecho con ellos.

Puesta a tierra del LLM

Para que la respuesta sea más relevante y contextual, el usuario puede fundamentar el LLM con información adicional. Por ejemplo, pueden ingresar el siguiente mensaje:

Usted es John Smith, representante de cuentas de Northern Trail Outfitters.
Escriba un correo electrónico de presentación a Lisa Martinez, directora ejecutiva de ACME.
Aquí hay una lista de los últimos tres pedidos que Acme realizó a Northern Trail Outfitters:
Colección Verano 2023: $375,286
Colección Primavera 2023: $402,255
Colección Invierno 2022: $357,542

Esto permite que el LLM genere un resultado mucho más relevante. Sin embargo, este enfoque plantea dos problemas:

  1. El usuario debe ingresar mucha información de conexión a tierra manualmente. Por lo tanto, la calidad del resultado depende en gran medida de la calidad de la pregunta ingresada por el usuario.
  2. Está pasando información confidencial al proveedor del modelo donde potencialmente podría persistir o usarse para entrenar aún más el modelo, lo que significa que sus datos privados podrían aparecer en la respuesta generada por el modelo de otra persona.

Construcción rápida y puesta a tierra dinámica.

Para abordar la primera limitación anterior, puede construir el mensaje mediante programación. El usuario ingresa una cantidad mínima de información o simplemente hace clic en un botón en la aplicación y luego usted crea el mensaje mediante programación agregando datos relevantes. Por ejemplo, en respuesta a un clic en el botón “Escribir correo electrónico de introducción”, podría:

  1. Llame a un servicio para obtener información sobre el usuario.
  2. Llame a un servicio para obtener información sobre el contacto.
  3. Llame a un servicio para obtener la lista de oportunidades recientes.
  4. Construya el mensaje utilizando la información obtenida de los servicios de datos anteriores.

Así es como podrían verse estos pasos de construcción rápidos en Apex:

El principal inconveniente de este enfoque es que requiere un código personalizado para cada mensaje para poder realizar la sencilla tarea de fusionar datos dinámicos en texto estático.

Plantillas de aviso

Para facilitar la construcción del mensaje, podemos usar plantillas: un patrón de desarrollo de software bien conocido que se usa comúnmente para fusionar datos dinámicos en documentos estáticos. Con una plantilla, escribe un archivo de solicitud utilizando marcadores de posición que se reemplazan dinámicamente con datos dinámicos en tiempo de ejecución.

Así es como se vería el ejemplo de Apex anterior usando un lenguaje de plantilla genérico:

Eres {{ user.Name }}, {{user.Title}} en {{ user.CompanyName }}
Escriba un correo electrónico de presentación a {{ contact.Name }}, {{contact.Title}} en {{ contact.Account.Name }}
Estas son las oportunidades de {{contact.Account.Name}}:
{{#oportunidades}}
{{Nombre}}: {{Cantidad}}

{{/oportunidades}}

Las plantillas de mensajes no solo son útiles para crear mensajes mediante programación, sino que también se pueden utilizar como base para herramientas gráficas que admiten la creación de mensajes en un entorno de arrastrar y soltar.

Estudio rápido

Por eso creamos Prompt Studio, un nuevo creador de Salesforce que facilita la creación de indicaciones. Le permite crear plantillas de mensajes en un entorno gráfico y vincular campos de marcador de posición a datos dinámicos disponibles a través de datos de páginas de registro, un flujo, una nube de datos, una llamada de Apex o una llamada API. Una vez creada, se puede utilizar una plantilla de solicitud en diferentes lugares para consultar el modelo, incluidas las páginas de registro y el código Apex.

Capa de confianza de Einstein

Prompt Builder le permite definir mensajes basados dinámicamente en un entorno gráfico. Pero, ¿cómo se envía ese mensaje de forma segura a un proveedor de LLM?

Puede enviar el mensaje directamente a la API del proveedor de LLM, pero hay una serie de preguntas a considerar con ese enfoque:

  • ¿Qué pasa con los problemas de cumplimiento y privacidad si pasa datos de información de identificación personal (PII) en el mensaje? ¿El proveedor del modelo podría conservar los datos de PII o incluso utilizarlos para entrenar aún más el modelo?
  • ¿Cómo se evitan las alucinaciones, la toxicidad y los sesgos en los resultados generados por los LLM?
  • ¿Cómo se rastrea y registra los pasos de creación de mensajes con fines de auditoría?

Si utiliza la API del proveedor de LLM directamente, tendrá que escribir un código personalizado para responder a estas preguntas. Hay muchas cosas a considerar y puede resultar difícil hacerlo bien para todos los casos de uso.

Ingrese a la capa de confianza de Einstein. Einstein Trust Layer le permite enviar solicitudes a LLM de forma confiable, abordando las inquietudes mencionadas anteriormente.

Así es como funciona:

  1. En lugar de realizar llamadas API directas, utiliza LLM Gateway para acceder al modelo. LLM Gateway admite diferentes proveedores de modelos y abstrae las diferencias entre ellos. Incluso puedes conectar tu propio modelo.
  2. Antes de enviar la solicitud al proveedor del modelo, pasa por una serie de pasos que incluyen el enmascaramiento de datos que reemplaza los datos PII con datos falsos para garantizar la privacidad y el cumplimiento de los datos.
  3. Para proteger aún más sus datos, Salesforce tiene acuerdos de retención cero con proveedores de modelos, lo que significa que los proveedores de modelos no persistirán ni entrenarán más sus modelos con datos enviados desde Salesforce.
  4. Cuando se recibe el resultado del modelo, pasa por otra serie de pasos, incluido el desenmascaramiento, la detección de toxicidad y el registro de seguimiento de auditoría. Demasking restaura los datos reales que fueron reemplazados por datos falsos por motivos de privacidad. La detección de toxicidad comprueba si hay contenido dañino u ofensivo en el resultado. El registro de seguimiento de auditoría registra todo el proceso con fines de auditoría.

De cara al futuro: creación de aplicaciones de una forma totalmente nueva

Ahora echemos un vistazo a lo que viene y abordemos la segunda pregunta planteada al principio de este artículo: ¿Cómo cambiará la IA generativa la naturaleza de las aplicaciones?

Encadenamiento rápido

La lógica involucrada en la creación de un mensaje a veces puede volverse compleja. Puede implicar múltiples llamadas a API o servicios de datos, como en el ejemplo de conexión a tierra dinámica anterior. Responder a la pregunta de un solo usuario puede incluso implicar varias llamadas al LLM. Esto se llama encadenamiento rápido. Considere el siguiente ejemplo:

Para construir el mensaje:

  1. Realizamos una primera llamada API o servicio de datos para obtener datos contextuales de la empresa
  2. Los datos que regresan de la primera llamada al servicio de datos se usan para crear un primer mensaje que usamos para consultar el LLM.
  3. La salida del LLM se utiliza como entrada para una segunda llamada de servicio de datos.
  4. Los datos que regresan de la segunda llamada al servicio de datos se utilizan para crear un segundo mensaje cuya respuesta se envía al usuario.

Las posibilidades de combinar llamadas de servicios de datos y llamadas de LLM para generar un resultado son infinitas.

Orquestación de IA

El enfoque descrito hasta ahora funciona bien, pero a medida que estos flujos de trabajo se vuelven más complejos, podemos ver la necesidad de alguna forma de orquestación. Como desarrollador, luego crearía una serie de bloques de construcción que realizan tareas granulares: recuperar datos sobre un cliente, actualizar un registro, realizar alguna lógica computacional, etc. Estos bloques de construcción se pueden orquestar o remezclar de diferentes maneras usando un herramienta de orquestación. Esto se podría hacer usando una herramienta de orquestación tradicional que le permita definir qué bloques de construcción usar, en qué orden y cuándo (con diferentes ramas "si"). Pero, ¿qué pasaría si la orquestación en sí estuviera impulsada por IA con un orquestador que pudiera razonar y elegir qué bloques de construcción usar y cómo componerlos para realizar una tarea específica? La orquestación impulsada por IA es un nuevo paradigma poderoso que tiene el potencial de revolucionar la forma en que interactuamos con los sistemas de IA y creamos aplicaciones.

El siguiente diagrama describe este nuevo paradigma de bloques de construcción orquestado por IA a un alto nivel.

En este diagrama, las acciones son los componentes básicos descritos anteriormente. Podrían ser acciones invocables de Apex, API de MuleSoft o indicaciones. Algunas acciones fundamentales están disponibles de forma predeterminada y otras serán desarrolladas por los desarrolladores. Esto también crea una oportunidad para un mercado de acciones creado por desarrolladores y socios.

El planificador es el orquestador impulsado por IA. Cuando la solicitud se pasa al tiempo de ejecución de la orquestación, el planificador elige (crea un plan para) qué acciones usar y cómo componerlas para responder mejor a la solicitud del usuario.

La orquestación de IA es un área activa de investigación en Salesforce y en la industria en su conjunto.

Resumen

El uso de modelos existentes a través de API es una forma común de crear aplicaciones impulsadas por IA con LLM. Con este enfoque, es necesario basar el modelo en datos privados o contextuales de la empresa para obtener resultados más relevantes y útiles. En lugar de pedirle al usuario que ingrese una gran cantidad de información básica manualmente, puede crear el mensaje mediante programación llamando a servicios de datos y agregando datos contextuales al mensaje. Prompt Studio es un nuevo creador de Salesforce que facilita la creación de mensajes al permitirle crear plantillas de mensajes en un entorno gráfico y vincular campos de marcador de posición a datos dinámicos. Einstein Trust Layer le permite enviar mensajes a las API de los proveedores de LLM de forma confiable, abordando problemas de privacidad, sesgos y toxicidad de los datos. La orquestación impulsada por la IA es un paradigma emergente que podría cambiar la forma en que interactuamos con los sistemas de IA y creamos aplicaciones.

Sobre el Autor

Christophe Coenraets es vicepresidente senior de Trailblazer Enablement en Salesforce. Es un desarrollador de corazón con más de 25 años de experiencia en la creación de aplicaciones empresariales, habilitando audiencias técnicas y asesorando a organizaciones de TI.

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

Añadir a holgura Suscríbete a RSS

Seguir leyendo

Einstein GPT para desarrolladores: ahora en versión piloto ☁️

Einstein GPT para desarrolladores: ahora en versión piloto ☁️

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.

Einstein GPT para desarrolladores: ahora en fase piloto | Blog de desarrolladores de Salesforce

La IA generativa es una tecnología transformadora que aumenta la productividad de los desarrolladores, acelera el desarrollo de aplicaciones de software y reduce la barrera para que cualquiera aprenda a programar. En el TrailblazerDX de este año, anunciamos Einstein GPT para desarrolladores , la solución de inteligencia artificial generativa de Salesforce que libera la productividad de los desarrolladores y les permite desarrollar Salesforce más rápido . Hoy, estamos encantados de anunciar que Einstein GPT para desarrolladores ahora está en piloto cerrado.

Creado específicamente para lenguajes y marcos de Salesforce, Einstein GPT para desarrolladores puede generar código Apex utilizando lenguaje natural. El soporte para LWC llegará pronto. Nuestro objetivo es que esté disponible en Beta abierta en Dreamforce 23 , para que todos puedan tener acceso a la herramienta. En este blog, exploraremos cómo comenzar con Einstein GPT para el desarrollo de Apex y cómo su potencial puede revolucionar su proceso de desarrollo.

Einstein GPT para desarrolladores frente a otras herramientas de codificación de IA

Las herramientas de codificación de IA generativa disponibles en la actualidad se entrenan principalmente en lenguajes públicos, como Java, Python y otros, así como en código disponible públicamente. Dado que los lenguajes específicos de Salesforce, como Apex y LWC, son propietarios, estas herramientas a menudo carecen de la capacitación necesaria para brindar recomendaciones precisas.

Además, las herramientas de codificación de IA son tan poderosas como el contexto que se les proporciona. Dado que estas herramientas de codificación públicas carecen del contexto de Salesforce de su organización, como los metadatos, las recomendaciones pueden ser inexactas o insuficientes para satisfacer sus necesidades. Por último, el uso de herramientas de inteligencia artificial disponibles públicamente expone su código privado más allá del límite de confianza de Salesforce y podría hacerlo público, una posible vulnerabilidad de seguridad.

Con Einstein GPT para desarrolladores, utilizamos CodeGen , nuestro propio modelo de código abierto para la síntesis de programas. Hospedamos CodeGen dentro del límite de confianza de Salesforce y lo hemos capacitado en lenguajes específicos de Salesforce como Apex y LWC. Con una base dinámica incorporada al proceso de generación de código, Einstein GPT enriquece sus recomendaciones utilizando sus metadatos y código. Nuestra capa de confianza de IA dentro de Einstein GPT garantiza que sus datos y código permanezcan seguros dentro de Salesforce y nunca se almacenen externamente.

Comience con Einstein GPT para desarrolladores

Einstein GPT para desarrolladores se encuentra actualmente en una fase piloto cerrada. Nuestro plan es que esté disponible en Open Beta para Dreamforce 2023. Una vez que su organización esté habilitada para esta herramienta, puede instalar la extensión Einstein GPT en su VS Code Desktop usando un archivo VSIX compartido. Einstein GPT también estará disponible en Code Builder , nuestro IDE basado en web, que se espera que esté disponible de forma general en octubre. ¡Estén atentos a las actualizaciones!

Para utilizar la herramienta Einstein GPT para desarrolladores de forma eficaz:

  1. Abra su VS Code, vaya a Archivo > Abrir carpeta en el menú y abra un proyecto de Salesforce DX existente o configure un nuevo proyecto.
  2. Para trabajar con Einstein GPT para desarrolladores, ejecute el comando SFDX: Autorizar una organización para conectarse a una organización sandbox o a una organización borrador de Salesforce. Podrá utilizar Einstein GPT para desarrolladores dentro de este entorno.

Si está utilizando organizaciones borrador, active Einstein GPT para desarrolladores habilitando la función adicional de organización borrador. Simplemente edite y guarde el archivo config/project-scratch-def.json en su proyecto DX y agregue la función EinsteinGPTForDevelopers a su lista de funciones existente.

Por ejemplo:

Finalmente, puede comenzar a generar código Apex escribiendo un mensaje mediante el comando Paleta de comandos: SFDX: generar código con Einstein GPT (ver captura de pantalla a continuación) . Tenga en cuenta que debe estar dentro de un archivo Apex ( .cls ) para que aparezca el comando.

A continuación se muestra un mensaje de ejemplo:

Quiero crear una clase de Apex. Llamémoslo OpportunityQuerySelector. Cree un método llamado getSumOfOpportunityRecords que recupere la cantidad de registros de oportunidades vinculados a un registro de cuenta específico. El método debe aceptar accountId como parámetro. Siga las mejores prácticas de seguridad y asegúrese de que el código se ejecute en el modo de usuario.

Y luego el resultado se muestra a continuación.

Si bien el código generado anteriormente no requirió muchas ediciones, es posible que necesite personalizar la salida generada por Einstein GPT según sus necesidades durante el desarrollo. El panel Einstein GPT: Historial y comentarios dentro del IDE le permite compartir comentarios sobre el resultado generado. ¡Estos comentarios son imprescindibles para ayudarnos a capacitar a nuestro LLM y mejorar su resultado! Estamos emocionados de escuchar sus comentarios.

Transformando el proceso de desarrollo

Recién estamos comenzando con la IA generativa para transformar su flujo de trabajo de desarrollo. Mira lo que viene pronto:

  • Compatibilidad con Lightning Web Component (LWC): genere código LWC basado en el procesamiento del lenguaje natural (NLP)
  • Finalización predictiva de código en línea: complete automáticamente la siguiente línea de código sugerida con metadatos contextuales del proyecto.
  • Verificación del rendimiento del código: escanee el código Apex y corrija errores de tiempo de ejecución durante el proceso de desarrollo
  • Asistencia conversacional: Pídale a Einstein que genere código contextual y documentación, explique el código o resuelva problemas complejos.

Conclusión

A medida que Einstein GPT para desarrolladores amplíe sus capacidades para admitir LWC, proporcionar finalización de código inteligente y brindar asistencia conversacional, podrá desarrollar la plataforma Salesforce más rápido que nunca. Nuestro objetivo es que esté disponible en Beta abierta en Dreamforce 2023 , para que todos puedan tener acceso a la herramienta. ¡Únase a nosotros en Dreamforce '23 para jugar y profundizar en Einstein GPT para desarrolladores!

Recursos adicionales

Sobre el Autor

Mohith Shrivastava es desarrollador defensor en Salesforce con una década de experiencia en la creación de productos a escala empresarial en la plataforma Salesforce. Mohith se encuentra actualmente entre los principales contribuyentes de Salesforce Stack Exchange, un foro de desarrolladores donde los desarrolladores de Salesforce pueden hacer preguntas y compartir conocimientos. Puedes seguirlo a través de LinkedIn .

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

Añadir a holgura Suscríbete a RSS

Seguir leyendo

Liberando el poder de Apex en Salesforce Data Cloud — Parte 1 ☁️

Liberando el poder de Apex en Salesforce Data Cloud — Parte 1 ☁️

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.

Libere el poder de Apex en Salesforce Data Cloud — Parte 1 | Blog de desarrolladores de Salesforce

Trailblazer.me estará fuera de línea por mantenimiento programado a partir del 21 de julio de 2023 a las 6 p. m. (hora del Pacífico) hasta el 22 de julio de 2023 mientras transformamos Trailblazer.me en la nueva cuenta de Trailblazer. Durante este tiempo de inactividad, no podrá iniciar sesión en ninguna aplicación relacionada, incluidas Ayuda y capacitación, AppExchange, Trailhead y Trailblazer Community, y más.

Salesforce Data Cloud permite a los desarrolladores aprovechar el poder de los grandes datos para las empresas. Al utilizar Data Cloud, los clientes pueden consolidar los datos de clientes de múltiples sistemas en una única instancia de Salesforce, creando una vista unificada de los datos en toda la empresa. Estos datos se pueden utilizar para análisis, aprendizaje automático y acciones automatizadas. En este primer blog de nuestra serie de dos partes, exploraremos diferentes utilidades de Apex para consultar datos en Data Cloud y brindaremos orientación sobre cómo utilizarlas de manera efectiva.

Apex ofrece una variedad de utilidades para Data Cloud. Por ejemplo, permite que los desarrolladores construyan con Lightning Web Components para personalizar las experiencias de usuario estándar de Data Cloud, o que los ISV construyan su propio código para automatizar operaciones específicas de Data Cloud, como la resolución de identidades, la creación y ejecución de conocimientos calculados de Data Cloud o la segmentación.

Objetos de Salesforce Data Cloud frente a objetos estándar/personalizados

Antes de analizar cómo consultar datos de Data Cloud, comprendamos un poco acerca de los objetos de Salesforce Data Cloud y cómo difieren con respecto a los objetos estándar/personalizados de Salesforce Platform.

Salesforce Data Cloud tiene un modelo de datos canónico que incluye objetos de lago de datos (DLO) y objetos de modelo de datos (DMO). Puede leer acerca de cómo estos objetos se asignan entre sí y sus propósitos en la documentación de ayuda.

Los objetos de Data Cloud pueden ingerir y almacenar volúmenes de datos mucho más grandes (en la magnitud de miles de millones de registros) en comparación con los objetos estándar y personalizados regulares en la Plataforma de Salesforce. Los objetos estándar/personalizados están diseñados para casos de uso transaccional y no son adecuados para almacenar y procesar big data. Por otro lado, los objetos de Data Cloud agregan capacidades similares a las de un lago de datos .

Otra distinción clave es que los objetos de Data Cloud no admiten disparadores Synchronous Apex. Sin embargo, aún puede lograr la automatización de procesos suscribiéndose a Change Data Capture (CDC) y utilizando Flows o Apex. Lo que es común entre los objetos de la nube de datos y los objetos de la plataforma es que están construidos sobre la misma base impulsada por metadatos, lo que hace posible el uso de características de la plataforma, como Salesforce Flow, Apex y Platform Events.

Cómo consultar datos de Data Cloud en Apex

Antes de profundizar en algún código, exploremos un ejemplo de caso de uso de una aplicación de nube de datos.

Ejemplo de caso de uso y supuestos

Para nuestros ejemplos de código en esta publicación de blog, supongamos que estamos trabajando para una empresa ficticia llamada Solar Circles que captura datos de todos sus paneles solares instalados en Data Cloud. Cada mes, se generan decenas de millones de puntos de datos a partir de estos paneles. Al tener estos datos en Data Cloud, Solar Circles obtiene la capacidad de realizar análisis, utilizar técnicas de aprendizaje automático y obtener información procesable de los datos.

El código de Apex en esta publicación asume una condición importante: la nube de datos está habilitada y el código de Apex se ejecuta en la organización de la nube de datos y no en las organizaciones de Salesforce que están conectadas a la organización de la nube de datos.

Consultar datos de Data Cloud usando SQL

Para acceder a datos de objetos de Data Cloud (DLO o DMO), utilice la clase CdpQuery (ver documentos ) en Apex. Esta clase está disponible en el espacio de nombres ConnectApi (ver documentos ).

A continuación se muestra un fragmento de código de ejemplo que muestra cómo acceder a los datos de un objeto de nube de datos mediante una instrucción SQL.

<dx-code-block title language="apex" code-block="@AuraEnabled(cacheable=true)
public static void getSolarPanelData(String customerId) { List<Map> returnData = new List<Map>(); // Create input for query operation ConnectApi.CdpQueryInput queryInput = new ConnectApi.CdpQueryInput(); queryInput.sql = ‘SELECT * ‘ + ‘FROM Solar_Panel_Events_solar_panel_F4C03__dlm ‘ + ‘WHERE CustomerId__c = » + customerId + » ‘ + ‘ORDER BY date_time__c DESC LIMIT 50’; // Execute SQL ConnectApi.CdpQueryOutputV2 response = ConnectApi.CdpQuery.queryAnsiSqlV2( queryInput ); Map responseMetadata = new Map(); responseMetadata = response.metadata; // Parse response System.debug( ‘Number of rows in the result data set ‘ + response.rowCount ); System.debug(‘Next batch ID ‘ + response.nextBatchId); System.debug(‘Query Metadata’ + responseMetadata); for (ConnectApi.CdpQueryV2Row resultRow : response.data) { for (Object result : resultRow.rowData) { system.debug(result); } } «>

En el ejemplo anterior, estamos recuperando datos para un componente LWC personalizado en una página Lightning de caso de objeto estándar para un agente de servicio. El componente muestra datos de dispositivos recientes provenientes de los paneles instalados en el sitio del cliente.

Aspectos destacados del código

  • El método toma un parámetro customerId , lo que indica que recupera los datos del panel solar para un cliente específico
  • Se crea una instancia de ConnectApi.CdpQueryInput llamada queryInput para definir la operación de consulta.
  • La propiedad queryInput.sql se establece con una consulta SQL que selecciona todos los campos del objeto de datos Solar_Panel_Events_solar_panel_F4C03__dlm , filtrado por CustomerId__c
  • La consulta se ejecuta mediante ConnectApi.CdpQuery.queryAnsiSqlV2(queryInput) , que devuelve un objeto ConnectApi.CdpQueryOutputV2 denominado response
  • El response.metadata se asigna a responseMetadata , que almacena los metadatos de la respuesta de la consulta.

Consideraciones importantes

  • Apex tiene un límite de CPU de 10 segundos para transacciones sincrónicas. Data Cloud puede contener miles de millones de filas de datos. Al recuperar datos en Apex desde Data Cloud, asegúrese de agregar suficientes filtros y proporcionar contexto (como el recordId con el que está trabajando) para limitar la cantidad de filas y evitar alcanzar el límite de CPU de 10 segundos.
  • Si está recuperando una gran cantidad de datos, use Queueable Apex para ejecutar el proceso de forma asincrónica y aproveche el límite de CPU de 60 segundos.
  • Recomendamos usar queryAnsiSqlV2 (consulte los documentos ) en lugar de queryAnsiSql para aprovechar las solicitudes posteriores y los tamaños de respuesta más grandes para casos de uso en los que necesita extraer grandes volúmenes de datos.
  • Use nextBatchAnsiSqlV2(nextBatchId) (ver documentos ) para proporcionar batchId de la respuesta anterior para recuperar el siguiente conjunto de resultados.
  • También puede usar SOQL en lugar de SQL, pero asegúrese de obtener su SOQL usando el Explorador de datos , ya que hay funciones de SOQL que pueden no ser aplicables a los objetos de Data Cloud.

Cómo buscar información de perfil

Antes de analizar cómo buscar información de perfil de Data Cloud en Apex, debemos comprender qué es un perfil unificado.

Perfil unificado y resolución de identidad

Supongamos que Solar Circles, nuestro fabricante ficticio de paneles solares, tiene datos sobre un cliente llamado Martha en varios sistemas. Cada sistema tiene información diferente sobre ella, como diferentes direcciones de correo electrónico. Estos datos únicos se denominan puntos de contacto . Los clientes como Martha están representados por múltiples registros de contacto y perfiles específicos del sistema en varios sistemas. Esto es necesario para que cada nube y producto funcione de forma independiente, pero puede crear silos de datos.

Data Cloud proporciona una función de resolución de identidad para resolver este problema. Mediante el uso de reglas de identidad , el sistema crea perfiles individuales unificados que se pueden usar para segmentación y activaciones en varios otros sistemas.

Buscar información de perfil de Data Cloud

A continuación se muestra un código Apex de utilidad de ejemplo que busca información de perfil. Tenga en cuenta que se utiliza el método queryProfileApi de la clase ConnectApi.CdpQuery .

<dx-code-block title language="apex" code-block=" @AuraEnabled public static List getProfileData( String dataModelName, String childDataModelName, String searchKey, String customerName ) { ConnectApi.CdpQueryOutput response = ConnectApi.CdpQuery.queryProfileApi( dataModelName, // Name of the data model object, for example, UnifiedIndividual__dlm customerName, // Value of the primary or secondary key field, for example, John. If unspecified, defaults to the value of the primary key field. childDataModelName, // Name of the child data model object, for example, UnifiedContactPointEmail__dlm. searchKey, // If a field other than the primary key is used, name of the key field, for example, FirstName__c null, // Comma-separated list of equality expressions within square brackets null, // Comma-separated list of child object field names that you want to include in the result 100, // Number of items to return. null, // Number of rows to skip before returning results. null // Sort order for the result set, ); return response.data; } «>

Aquí hay un fragmento de código de ejemplo que invoca el código de utilidad anterior al pasar los parámetros.

<dx-code-block title language="apex" code-block=" List response = DataCloudUtils.getProfileData( ‘UnifiedIndividual__dlm’, ‘UnifiedContactPointEmail__dlm’, ‘ssot__FirstName__c’, ‘Martha’ ); «>

El código busca la información de perfil del cliente Martha en el objeto de modelo de datos UnifiedIndividual__dlm .

Aspectos destacados del código

  • El método utiliza ConnectApi.CdpQuery.queryProfileApi() para ejecutar la consulta de datos de perfil en la nube de datos
  • Los parámetros de consulta incluyen los nombres del objeto del modelo de datos ( dataModelName ), el objeto del modelo de datos secundario ( childDataModelName ), el campo de clave de búsqueda ( searchKey ) y el nombre del cliente ( customerName )
  • Se pueden proporcionar parámetros opcionales adicionales, como expresiones de igualdad, nombres de campos de objetos secundarios, la cantidad de elementos para devolver, la cantidad de filas para omitir y el orden de clasificación para el conjunto de resultados.
  • La respuesta de la consulta se almacena en un objeto ConnectApi.CdpQueryOutput llamado response
  • El método devuelve response.data , que representa los datos recuperados de la consulta

Importante consideración

  • Vuelva a verificar los nombres de campo y objeto antes de usarlos en el código de Apex, ya que, de lo contrario, el método puede generar excepciones y errores internos del servidor.

¿Cómo consultar datos de conocimientos calculados?

Los conocimientos calculados le permiten definir y calcular métricas multidimensionales en todo su estado digital en Data Cloud. Data Cloud genera información calculada al escribir SQL , de manera declarativa usando Insights Builder o usando Apex.

Streaming vs insights calculados

Hay dos tipos de información en Data Cloud: transmisión e información calculada.

Los conocimientos calculados son funciones que pueden calcular métricas en datos históricos. Se procesan en lotes. Por ejemplo, en nuestra aplicación Solar Circles, podemos tener una visión calculada que mide la potencia total generada por los paneles agrupados por cada cliente.

La información de transmisión se genera casi en tiempo real mediante el análisis del flujo continuo de datos entrantes. Estos conocimientos permiten la activación inmediata de acciones en los sistemas posteriores. Por ejemplo, la información de transmisión se puede utilizar para identificar a los clientes cuyos paneles solares generan una potencia mínima. Al aprovechar una acción de datos en la transmisión de conocimientos, podemos crear de manera proactiva un caso para dichos clientes en Salesforce Service Cloud.

Consultar datos a partir de una perspectiva calculada

Para consultar datos de las perspectivas calculadas, use el método queryCalculatedInsights de la clase CdpQuery . A continuación se muestra un fragmento de código de ejemplo que muestra cómo consultar datos de una perspectiva calculada conocida.

Aspectos destacados del código

  • El método queryCalculatedInsights de ConnectApi.CdpQuery se usa para recuperar información calculada de Data Cloud.
  • El primer parámetro es el nombre de API de la información calculada, que debe terminar con __cio . Por ejemplo, <calculted insight api name> podría reemplazarse por totalpowergenerated__cio .
  • Los siguientes parámetros especifican dimensiones y medidas. Una dimensión representa un campo o atributo en el que se basa la información, mientras que una medida representa la métrica calculada. Proporcionar null para estos parámetros incluye todas las dimensiones y medidas disponibles.
  • Se puede especificar el orden de clasificación para el conjunto de resultados, pero en este fragmento de código, se establece en null .
  • Los parámetros opcionales adicionales incluyen filtrar el conjunto de resultados a un ámbito o tipo más específico y especificar la cantidad de elementos que se devolverán y la cantidad de filas que se omitirán antes de devolver los resultados.
  • Los datos resultantes se almacenan en un objeto ConnectApi.CdpQueryOutput denominado response .

Importante consideración

  • Asegúrese de proporcionar el nombre de API correcto para la información. Un nombre de API incorrecto da como resultado un error del sistema.

Conclusión

En esta publicación de blog, brindamos una descripción general de cómo puede aprovechar el poder de Salesforce Data Cloud y Apex para aprovechar los grandes datos para las empresas. Los ejemplos de código y los puntos destacados demuestran enfoques prácticos para acceder y consultar datos de objetos de Data Cloud.

La publicación también destaca las mejores prácticas y las limitaciones que se deben tener en cuenta al trabajar con Data Cloud y Apex, como administrar los límites de la CPU, utilizar el procesamiento asincrónico para grandes conjuntos de datos y garantizar la denominación correcta de la API para los conocimientos calculados.

En la siguiente parte de la serie, profundizaremos en las clases de Apex como CdpCalculatedInsight (consulte los documentos ), CdpIdentityResolution (consulte los documentos ) y CdpSegment (consulte los documentos ) que se pueden usar para administrar información calculada, crear reglas de resolución de identidad y segmentación en Data Cloud mediante Apex.

Referencias adicionales

Sobre el Autor

Mohith Shrivastava es promotor de desarrollo en Salesforce con una década de experiencia en la creación de productos a escala empresarial en la plataforma de Salesforce. Actualmente se está enfocando en las herramientas para desarrolladores de Salesforce, Flow, Apex y Lightning Web Components en Salesforce. Mohith se encuentra actualmente entre los principales contribuyentes en Salesforce Stack Exchange, un foro de desarrolladores donde los desarrolladores de Salesforce pueden hacer preguntas y compartir conocimientos. Puedes seguirlo a través de su Twitter @msrivastav13 .

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

Seguir leyendo

Incrustar flujos de pantalla en el componente web Lightning

Incrustar flujos de pantalla en el componente web Lightning

Última actualización el 19 de julio de 2023 por Rakesh Gupta

Gran idea o pregunta duradera:

  • ¿Cómo incrusta un flujo de pantalla dentro de un componente web Lightning?

Objetivos:

Después de leer este blog, podrá:

  • Incruste el flujo de pantalla dentro de un componente web Lightning
  • Aplicar representación condicional en el componente web Lightning
  • Use uiRecordApi para obtener el valor del campo del registro sin usar la clase de Apex
  • y mucho más

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

  1. Pasar datos del componente web Lightning al flujo de pantalla
  2. Uso del componente web Lightning para mostrar un banner de alerta

Janel Parrish trabaja como desarrollador junior en Gurukul on Cloud (GoC). Se le ha encomendado un requisito comercial para desarrollar un componente LWC con las siguientes funcionalidades:

  1. Debería mostrar un flujo de pantalla llamado 'parterFlow' cuando el tipo de cuenta es 'Socio tecnológico'.
  2. Debería presentar un flujo de pantalla llamado 'customerFlow' cuando el tipo de cuenta es 'Cliente – Directo'.
  3. El componente LWC debe diseñarse con la capacidad de incorporarse en la página de registro de rayos de la cuenta.

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

Utilizaremos el componente lightning-flow para incrustar un flujo de pantalla en el componente lightning web. Para crear un flujo en el componente Lightning Web, establezca el atributo flowApiName del componente Lightning-Flow en el nombre de flujo que desea usar. El componente incluye botones de navegación (Atrás, Siguiente, Pausa y Finalizar) para que los usuarios naveguen dentro del flujo.

También usaremos un adaptador de cable uiRecordApi que nos permite interactuar con registros de Salesforce desde los componentes del componente web lightning sin escribir código Apex. Esta API le permite realizar operaciones como recuperar los datos de un registro o los detalles del diseño, crear, eliminar o actualizar un registro, etc. Estos son algunos de los métodos clave proporcionados por uiRecordApi :

  1. getRecord : este método le permite obtener datos de registro.
  2. getRecordCreateDefaults : este método proporciona los valores predeterminados que utiliza Salesforce al crear un nuevo registro.
  3. getRecordUi : obtiene los detalles de diseño de un registro, como qué campos se muestran, cómo se muestran, etc.
  4. createRecord : este método le permite crear un nuevo registro.
  5. deleteRecord – Le permite eliminar un registro.
  6. updateRecord : te permite actualizar un registro existente.

En el archivo de configuración XML, usaremos lightning__RecordPage como destino para permitir que el componente web de iluminación se use en una página de registro en Lightning App Builder.

Práctica guiada (nosotros hacemos):

Hay 3 pasos para resolver el requisito comercial de Janel utilizando Lightning Web Component y Screen Flow . Debemos:

  1. Cree un ScreenFlow (customerFlow) para manejar la solicitud del cliente
    1. Definir propiedades de flujo para el flujo de pantalla
    2. Agregue una variable de texto para almacenar el nombre de la cuenta
    3. Agregue una pantalla para mostrar el nombre de la cuenta desde una variable de texto
  2. Cree un ScreenFlow (partnerFlow) para manejar la solicitud del cliente
    1. Definir propiedades de flujo para el flujo de pantalla
    2. Agregue una variable de texto para almacenar el nombre de la cuenta
    3. Agregue una pantalla para mostrar el nombre de la cuenta desde una variable de texto
  3. Cree un componente web relámpago para mostrar los diferentes flujos de pantalla según el tipo de cuenta

Paso 1.1: Definir propiedades de flujo (customerFlow)

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

Paso 1.2: agregue una variable de texto al nombre de la cuenta de la tienda

  1. En Caja de herramientas , seleccione Administrador y, a continuación, haga clic en Nuevo recurso para almacenar el nombre de la cuenta.
  2. Ingrese la siguiente información :
    1. Tipo de recurso : Variable
    2. Nombre de API : nombre de cuenta
    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 1.3: agregue una pantalla para mostrar el nombre de la cuenta desde la variable de texto

  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.

Al final, Janel'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. 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 : 58
  5. Etiqueta de entrevista : customerFlow {!$Flow.CurrentDateTime}
  6. Haga clic en Guardar .

Paso 2.1: Definir propiedades de flujo (partnerFlow)

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

Paso 2.2: agregue una variable de texto al nombre de la cuenta de la tienda

  1. En Caja de herramientas , seleccione Administrador y, a continuación, haga clic en Nuevo recurso para almacenar el nombre de la cuenta.
  2. Ingrese la siguiente información :
    1. Tipo de recurso : Variable
    2. Nombre de API : nombre de cuenta
    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: agregue una pantalla para mostrar el nombre de la cuenta desde la variable de texto

  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.

Al final, Janel'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. 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 : 58
  5. Etiqueta de entrevista : flujo de socio { !$Flow.CurrentDateTime}
  6. Haga clic en Guardar .

Paso 3: cree un componente web Lightning para mostrar los diferentes flujos de pantalla según el tipo de cuenta

Debajo de la plantilla de componente web lightning, se muestra una tarjeta Lightning titulada Iniciar pedido . Dependiendo de si la propiedad isPartner o isCustomer es verdadera, se iniciará y mostrará el Lightning Flow correspondiente ("rakeshistomMVP__partnerFlow" o "rakeshistomMVP__customerFlow").

embedFlowToLWC.html

Utilizaremos el componente lightning-flow para incrustar un flujo de pantalla en el componente lightning web. Desglosemos el código:

  • En LWC, el archivo HTML de cada componente debe envolverse con una etiqueta <plantilla> .
  • <template if:true={isPartner}> y <template if:true={isCustomer}> : estas son plantillas condicionales que muestran contenido en función de la veracidad de las propiedades isPartner e isCustomer , respectivamente. El contenido dentro de estas plantillas solo se representará si la condición correspondiente es verdadera.

<plantilla> <div class="slds-m-alrededor_medio"> <lightning-card title="Iniciar pedido" icon-name="estándar:pedidos"> <div class="slds-m-alrededor_medio"> <template if:true={esSocio}> <lightning-flow onstatuschange={handleStatusChange} flow-api-name="rakeshistomMVP__partnerFlow" flow-input-variables={inputVariables}></lightning-flow> </plantilla> <template if:true={esCliente}> <lightning-flow onstatuschange={handleStatusChange} flow-api-name="rakeshistomMVP__customerFlow" flow-input-variables={inputVariables}></lightning-flow> </plantilla> </div> </tarjeta-relámpago> </div>
</plantilla>
embedFlowToLWC.js

Este código JavaScript de muestra usa el decorador @api para crear propiedades públicas. Por ejemplo, recordId es una propiedad reactiva pública que contiene el ID de la página de registro. Mientras que el decorador @wire lee los datos de Salesforce. getRecord es una función del módulo lightning/uiRecordApi que recupera un registro. accountType y accountName se importan del esquema de Salesforce.

  • Las declaraciones de importación se utilizan para importar los módulos y las dependencias necesarios. LightningElement es el componente básico para crear componentes web Lightning.
  • account({ error, data }) es una función que maneja la respuesta de la llamada getRecord . Si hay un error, asigna el error a this.error . Si se devuelven datos, establece this.accountName en el nombre de la cuenta y establece isPartner o isCustomer en verdadero según el tipo de cuenta.
  • get inputVariables() es un método captador que devuelve una matriz de objetos, que representa variables de entrada para un flujo. En este caso, devuelve el nombre de la cuenta.

import { LightningElement, api, wire } de 'lwc';
importar { getRecord } desde 'lightning/uiRecordApi';
importar tipo de cuenta desde '@salesforce/schema/Account.Type';
importar nombre de cuenta desde '@salesforce/schema/Account.Name'; exportar la clase predeterminada FlowLauncher extiende LightningElement { @api recordId; nombre de la cuenta; esSocio = falso; esCliente = falso; @wire(getRecord, { recordId: '$recordId', campos: [nombre de cuenta, tipo de cuenta] }) cuenta ({ error, datos }) { si (error) { this.error = error; } más si (datos) { this.accountName = data.fields.Name.value; if(data.fields.Type.value === 'Socio tecnológico') { this.isPartner = verdadero; this.isCustomer = false; } else if(data.fields.Type.value === 'Cliente - Directo') { this.isCustomer = true; this.isPartner = false; } } } obtener variables de entrada () { devolver [ { nombre: 'nombre de cuenta', tipo: 'Cadena', valor: este.nombreDeCuenta } ]; } handleStatusChange(evento) { if(evento.detalle.estado === 'FINALIZADO') { //Acción después de que un flujo haya terminado } }
}
embedFlowToLWC.js-meta.xml

El elemento isExposed se establece en verdadero, lo que hace que el componente esté disponible para su uso en herramientas como Lightning App Builder o Flow Builder.

El elemento de objetivos se usa para especificar dónde se puede usar su componente. En este caso, la etiqueta lightning__RecordPage significa que este componente está diseñado para usarse en una página de registro en Lightning App Builder.



<?versión xml=”1.0″ codificación=”UTF-8″?>
<LightningComponentBundle xmlns=”http://soap.sforce.com/2006/04/metadata”>
<apiVersion>58.0</apiVersion>
<isExposed>verdadero</isExposed>
<target>relámpago__RecordPage</target>
</objetivos>
</LightningComponentBundle>

Prueba de concepto

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.

Seguir leyendo

Comenzando con Acciones Externas ☁️

Comenzando con Acciones Externas ☁️

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.

Introducción a las acciones externas | Blog de desarrolladores de Salesforce

Tuve excelentes conversaciones con clientes y socios en Connections este año, así como a través de la comunidad Trailblazer de MC Account Engagement , con respecto a las acciones externas de Account Engagement . Seguía surgiendo una pregunta: "¿Cómo empiezo con las acciones externas?" En esta publicación, aprenderá qué son las acciones externas, cómo configurarlas y cómo probarlas. Además, sintonice una próxima sesión de codeLive el 20 de julio a las 10 a. m. PT , donde realizaré una demostración de codificación en vivo para mostrarle cómo crear una acción externa y responder sus preguntas.

¿Qué son las Acciones Externas?

Las acciones externas son una parte clave deMarketing App Extensions , ya que proporcionan una forma de desencadenar una acción en un sistema externo. El otro componente es Actividades externas, que proporciona una forma de activar la automatización de la participación de la cuenta en función de un evento de participación que ocurre en un sistema externo. Piense en ello como las dos caras de una moneda, las acciones se activan, las actividades se activan. Combinadas, forman una aplicación de extensibilidad de automatización para un servicio, por lo que puede tener una extensión de aplicación de marketing por SMS, por ejemplo.

Por este motivo, las acciones externas se empaquetan en una extensión de aplicación de marketing. En el momento de escribir este artículo, las actividades externas aún no se pueden empaquetar, pero eventualmente también se empaquetarán en la extensión de la aplicación de marketing.

Si desea conectar una aplicación de terceros para automatizar la ejecución de una acción de prospecto en ese sistema, entonces esta es definitivamente la función para usted. En esta publicación, profundizaremos en el lado de la acción externa de las extensiones de aplicaciones de marketing.

¿Cuáles son algunos buenos casos de uso para las acciones externas?

Bueno, si me preguntan, ¡diría absolutamente todo! Puede que estés pensando: “¡Claro, todo el mundo dice eso!”. Sin embargo, las posibilidades que desbloquean las acciones externas son realmente amplias. Si alguna vez ha dicho: "Me gustaría que cuando un prospecto llegue a este paso, yo pudiera <insertar deseo aquí>", entonces deseaba una acción externa.

Puede usar una acción externa para registrarse en un seminario web de Zoom desde Account Engagement (consulte el ejemplo en GitHub ). También puede usar una acción externa para enviar un mensaje SMS a través de Twilio, que presentamos en una publicación de blog anterior . Incluso puedes usar acciones externas con webhooks; Usé la función de captura de webhook de Zapier para crear una acción externa que usaba un cliente potencial como desencadenante de un Zap.

¿Qué constituye una acción externa?

Una acción externa consta de una acción invocable de Apex, metadatos de la extensión de la aplicación de marketing, metadatos de una acción externa y una forma de gestionar la autenticación. Los metadatos para las extensiones de la aplicación de marketing y las actividades externas conectan la acción invocable con la participación de la cuenta. Los componentes que se usarán para la autenticación pueden variar según el tipo de autenticación que admita el servicio. Como OAUTH 2.0 es bastante común, el componente que uso más es un proveedor de autorización y Credenciales con nombre . Las credenciales con nombre también facilitan la administración de la autenticación en mi código, y el sistema hace la mayor parte del trabajo.

¿Qué habilidades necesito para trabajar con Acciones Externas?

Con una gran flexibilidad viene la complejidad, por lo que necesitará algunas habilidades en ciertas áreas para construir con éxito una acción externa. Los siguientes son temas clave de los que necesitará una comprensión básica antes de abordar su propia acción externa.

SLDC de Salesforce

Comprender el ciclo de vida del desarrollo de Salesforce es muy importante para tener éxito en general. Recomiendo aprender Visual Studio y el proceso de implementación de la CLI. No se necesita maestría, solo lo básico para poder empezar. Trailhead ofrece una ruta para ayudarlo a configurar su espacio de trabajo .

Documentación de la API REST

El patrón del que hablamos en este artículo se basa en las API REST JSON. Para comprender lo que es posible y recopilar las entradas pertinentes para una acción externa, debe poder leer una especificación API. Consulte las especificaciones de la API de Account Engagement y Twilio .

Implementación de Apex y Apex

Apex Invocable Actions es mi forma preferida de codificar mis acciones externas, ya que me permite la mayor flexibilidad y control. Recomendaría, como mínimo, familiarizarse con la compilación y la implementación de código Apex mediante el proyecto Quick Start: Apex de Trailhead. Para obtener más información, encontré útil el trailmix de Apex Basics . No necesita convertirse en un experto, pero al menos debe estar lo suficientemente informado como para poder leer el código de la aplicación de referencia .

Flujo de Salesforce (opcional)

No necesita conocer Salesforce Flow para aprender Acciones externas. Sin embargo, es una herramienta de prueba muy poderosa para sus acciones externas, lo que facilita la creación de una interfaz de usuario para controlar las entradas durante la prueba. Si está familiarizado con Engagement Studio, Flow será bastante fácil ya que tiene muchos de los mismos conceptos. Utilicé la ruta Crear flujos con Flow Builder para ponerme al día. Otro beneficio de aprender Salesforce Flow es que abre la puerta a la creación de todo tipo de automatización de procesos comerciales.

¿Cómo debo configurar mi entorno de desarrollador?

Es importante configurar sus entornos de desarrollador y contar con las herramientas adecuadas antes de comenzar con las acciones externas. Yo uso las siguientes herramientas.

  • Postman : utilizo Postman para explorar una nueva API, por lo que puedo aprender a realizar una solicitud y responder de forma sencilla. Postman también proporciona una manera fácil de generar ejemplos.
  • CLI de Visual Studio + Salesforce — Uso Visual Studio para codificar mi acción invocable y la implemento en mi organización de desarrollador. La mayoría de las veces, es simplemente copiar y pegar un ejemplo anterior y editarlo para mi nuevo caso de uso.
  • Entorno de desarrollador/sandbox : este es un entorno seguro para construir, desarrollar y empaquetar sus acciones externas. Tenga en cuenta que, en el momento de escribir este artículo, solo admitimos paquetes de primera generación (1GP) , por lo tanto, no configure su organización de desarrollador como Dev Hub.
  • Salesforce Flow : personalmente me gusta usar ScreenFlows para probar una acción invocable. Es bueno poder controlar completamente la entrada antes de conectarla a acciones externas y programas ES.
  • Consola de desarrollador de Salesforce : esto le permite ver rápidamente el código o ver los registros de sus pruebas de flujo de pantalla.

Patrón básico para llamadas API REST con acciones externas

Si bien puede codificar acciones externas de muchas maneras, existe un patrón básico que recomiendo al realizar llamadas a la API REST.

Las dos etiquetas que debe recordar son InvocableVariable , que define las entradas y salidas de la acción invocable, e InvocableMethod , que es el método a llamar al ejecutar la acción invocable. Puede ver cómo se aplican en el siguiente código de ejemplo.

Normalmente creo dos clases, una para la entrada y otra para la solicitud de API. Separar mi código en dos clases facilita jsonificar la carga útil. Mi clase de entrada contiene todos los campos de variables invocables que la acción invocable necesita en la entrada. Mi solicitud de API contiene los campos de la solicitud JSON.

InvocableMethod construirá la carga útil a partir de la entrada, la convertirá a JSON y luego la agregará a la solicitud HTTP. A continuación, configura el resto de la solicitud HTTP agregando la URL, los encabezados y el método. Finalmente, realiza la llamada a la API y comprueba si el resultado es correcto o, de lo contrario, genera un error útil para diagnosticar un problema.

Consideración importante: el marco de acción externa espera que se devuelva un error si hay una falla en lugar de detectar el error y luego devolver el éxito. Si se devuelve un error, se informará en la tabla de errores.

Poniendo a prueba tus acciones externas

De vez en cuando, mientras crea una acción externa, encontrará errores. Cuanto más pueda probar sobre la marcha, más fácil será descubrir dónde radica el problema. Es por eso que recomiendo agregar un paso de prueba para probar en Salesforce Flow antes de probar en Engagement Studio. Elimina la configuración de la acción externa de la imagen, por lo que si la verifica aquí, pero no funciona en Engagement Studio, sabrá que el problema radica en la configuración de la acción externa.

Las pruebas lo ayudan a identificar errores, pero determinar la causa raíz y corregirlos es otra cosa. A continuación se presentan algunas de las técnicas que utilizo para diagnosticar las causas fundamentales.

  • Consola de desarrollador de Salesforce : utilizo la consola de desarrollo para ejecutar mis casos de prueba y confirmar la cobertura de mi código. Durante las pruebas exploratorias en Flow, mantengo abierta mi consola de desarrollo, por lo que genera registros para usar en la investigación de errores.
  • Rastreos de registro de Salesforce : si el error ocurre durante mi prueba de Engagement Studio, coloco un rastreo de usuario en el usuario de integración B2BMA, para poder ver mis registros de Apex y diagnosticar el problema más a fondo. Tenga cuidado, podría terminar con una gran cantidad de datos. El Usuario de Integración B2BMA es el usuario que ejecuta acciones externas.
  • Errores de acción externa de compromiso de cuenta : la tabla proporciona cualquier error devuelto por la acción externa que resultó en una falla. Es útil ver lo que sucedió durante una ejecución de ES.

SUGERENCIA: si tiene una cuenta de Gmail, puede usar un "+" para crear varios registros con su dirección de correo electrónico. Por ejemplo, puedo registrar tanto "ejemplo@ejemplo.com" como "ejemplo+usuario2@ejemplo.com" como prospecto, y cualquier correo enviado a esas direcciones iría al buzón de correo de ejemplo@ejemplo.com. Por ejemplo, usé esto para probar el ejemplo de registro de Zoom porque no quería que el correo electrónico registrado rebotara.

Errores comunes

Los errores van a suceder, así es la vida. Me he encontrado con algunos escenarios que me han hecho casi tirarme de los pelos.

El primero es garantizar que la acción exterior sea activa. Si la acción no aparece en Engagement Studio, es probable que esta sea la causa. Recuerde, debe activar tanto la extensión de la aplicación de marketing como la acción externa, además de asignarla a esa unidad comercial.

El siguiente es asegurarse de que su clase de Apex esté activa. La mayoría de las veces ya estará marcado como activo, es el estado predeterminado cuando creas una nueva clase. Es exactamente por eso que es fácil pasarlo por alto.

Otro es buscar extensiones de aplicaciones de marketing al empaquetar. No puedo decirte cuántas veces busco acciones externas, solo para tener un momento de confusión antes de recordar.

Finalmente, si su acción externa no funciona, pero no ve errores, verifique que la acción invocable fue diseñada para generar un error en caso de falla.

Lo anterior no es de ninguna manera exhaustivo, y es probable que encuentre sus propias alegrías. Sin embargo, recomiendo compartirlos con la comunidad si encuentra algunos buenos.

¿Que estas esperando? ¡Empiece hoy!

Ahora sabe casi todo lo que hago sobre las acciones externas, desde cómo funciona la función hasta los errores comunes. Recuerde que Acciones externas es su herramienta siempre que se encuentre diciendo: "Me gustaría hacer algo cuando el cliente potencial haga esto", y lo ayudará a automatizar esa acción.

Entonces, configure su entorno de desarrollador, revise la aplicación de referencia y comience a construir su acción externa hoy. El 20 de julio a las 10 a. m. (hora del Pacífico) , realizaremos una sesión de CodeLive en nuestro canal de YouTube para desarrolladores de Salesforce , así que únase y síganos mientras construimos una extensión de la aplicación de marketing de Twilio.

Recursos

Sobre el Autor

Christopher Cornett es gerente sénior de productos en Salesforce, responsable de la experiencia del desarrollador de Account Engagement. Ha trabajado para Salesforce durante más de cuatro años y tiene más de 13 años de experiencia en gestión de productos, trabajando principalmente en plataformas que van desde la atribución de big data hasta el fraude. Christopher ha ayudado a ofrecer API V5 y extensiones de aplicaciones de marketing, ayudando a los clientes a crear integraciones personalizadas para que su pila de marketing funcione para ellos. Le apasiona la experiencia del desarrollador y le encanta jugar con todas las excelentes funciones para ver qué es posible.

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

Seguir leyendo

Sube de nivel tus habilidades Apex ☁️

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

Seguir leyendo

Acceda dinámicamente a etiquetas personalizadas en Apex

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

Gran idea o pregunta duradera:

  • ¿Cómo acceder dinámicamente a la etiqueta personalizada en Apex?

Objetivos:

Después de leer este blog, podrá:

  • Acceda a la etiqueta personalizada en Apex dinámicamente
  • Acceda a la etiqueta personalizada en Apex de forma dinámica para un idioma
  • y mucho más

Ben Halpern es un desarrollador Jr. de Salesforce en Gurukul On Cloud (GoC) . Ben está escribiendo código Apex para una historia de usuario que requiere obtener la siguiente etiqueta personalizada en alemán e hindi.

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

Después del lanzamiento de S ummer'23 , puede usar el método System.Label.get(namespace, label, language) para obtener una etiqueta personalizada, especificando opcionalmente un idioma . La función ahora permite la resolución dinámica de nombres de etiquetas en tiempo de ejecución, incluida la anulación del idioma actual del usuario si existe una traducción para el idioma solicitado.

También puede comprobar si existe una traducción para una etiqueta y un idioma en un espacio de nombres mediante Label.translationExists(namespace, label, language) . No puede acceder a las etiquetas que están protegidas en un espacio de nombres diferente.

Práctica guiada (nosotros hacemos):

Hay 3 pasos para resolver el requisito comercial de Ben usando Apex y Custom Label . Debemos:

  1. Configuración del banco de trabajo de traducción
  2. Crear etiquetas personalizadas
  3. Script de Apex para acceder dinámicamente a etiquetas personalizadas

Paso 1: configurar el banco de trabajo de traducción

Este paso es opcional; sin embargo, debemos asegurarnos de que el banco de trabajo de traducción esté configurado correctamente para los requisitos actuales. Lea este artículo de ayuda para obtener instrucciones paso a paso.

Asegúrese de agregar idiomas para la traducción, asignar traductores para cada idioma y activar o desactivar las traducciones de un idioma. Agregaré mi cuenta de usuario a hindi y alemán para el caso de uso comercial actual.

Paso 2: crea etiquetas personalizadas

  1. Haga clic en Configuración .
  2. En el cuadro Búsqueda rápida, escriba Etiquetas personalizadas .
  3. Seleccione Etiquetas personalizadas y luego haga clic en Nueva etiqueta personalizada .
    1. Cree la etiqueta personalizada como se muestra en la siguiente captura de pantalla:
  4. Haga clic en Ejecutar .

Paso 2: Script de Apex para acceder dinámicamente a etiquetas personalizadas

  1. Haga clic en Configuración | Consola de desarrollador .  
  2. Usaré la herramienta Ejecutar Apex anónimo en Developer Console para ejecutar el código Apex.
    1. Un bloque anónimo es un código Apex que no se almacena en los metadatos, pero se puede compilar y ejecutar. Los bloques anónimos se ejecutan como el usuario actual y pueden fallar al compilarse si el código viola los permisos de objeto y de nivel de campo del usuario.
  3. Para abrir la ventana Ejecutar anónimo, haga clic en Depurar | Abra la ventana Ejecutar anónimo .
     String choiceInEnglish = System.Label.get('rakeshistomMVP','PreferredFoodChoice','');
    system.debug('Valor original-'+choiceInEnglish); String choiceInHindi = System.Label.get('rakeshistomMVP','PreferredFoodChoice','hi');
    system.debug('Hindi Value-'+choiceInHindi); String choiceInGerman = System.Label.get('rakeshistomMVP','PreferredFoodChoice','de');
    system.debug('Valor alemán-'+elecciónEnAlemán);
Seguir leyendo

Escriba Apex simplificado y seguro con las actualizaciones de Spring '23 ☁️

Escriba Apex simplificado y seguro con las actualizaciones de Spring '23 ☁️

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.

Escriba Apex simplificado y seguro con las actualizaciones de Spring '23 | Blog de desarrolladores de Salesforce

La versión Spring '23 de Salesforce Platform, disponible en general a partir del 13 de febrero, agregó algunas actualizaciones fantásticas al lenguaje de Apex. Hemos implementado algunas de las actualizaciones de Spring '23 en la aplicación de ejemplo Apex-Recipes , lo que ha simplificado significativamente la base de código existente.

En esta publicación de blog, revisaremos las actualizaciones en Spring '23 para Apex con ejemplos de código. Estas actualizaciones ayudan a los desarrolladores a crear aplicaciones más seguras para sus organizaciones.

1. Operaciones de base de datos en modo usuario

Apex, de forma predeterminada, se ejecuta en modo Sistema con permisos elevados, lo que significa que los desarrolladores pueden pasar por alto los controles de seguridad sin darse cuenta al escribir código.

Antes de continuar, revisemos rápidamente los controles de seguridad que los administradores de Salesforce pueden colocar para garantizar que los usuarios solo puedan acceder y manipular los datos para los que están autorizados a ver o editar. Las viñetas a continuación resumen diferentes mecanismos para aplicar un modelo de seguridad detallado para sus datos de Salesforce.

  • CRUD significa "Crear, Leer, Actualizar y Eliminar", las cuatro operaciones básicas que un usuario puede realizar en un registro en Salesforce
  • FLS significa "Seguridad de nivel de campo", que determina qué campos dentro de un registro que un usuario puede ver o editar
  • El uso compartido de registros permite al administrador configurar reglas sobre quién puede ver o editar un registro en función de varios criterios.

Con las operaciones de base de datos en modo usuario , los desarrolladores pueden optar por ejecutar Apex en el contexto del usuario, lo que garantiza que se apliquen las reglas CRUD/FLS y de uso compartido del usuario configuradas. Veamos esto en acción con ejemplos de código detallados.

Aplicar CRUD/FLS y reglas de uso compartido para SOQL estático

Puede indicar el modo de operación usando la palabra clave WITH USER_MODE para el modo de usuario y WITH SYSTEM_MODE para el modo de sistema en su consulta SOQL. Vea el ejemplo a continuación.

<dx-code-block title language code-block="List accounts = [SELECT Name, ShippingCity, ShippingStreet FROM Account WITH USER_MODE];»>

En el ejemplo anterior, al usar la palabra clave WITH USER_MODE , la consulta respeta estas restricciones de seguridad:

  • Permisos de lectura en el objeto Cuenta (configurado para Perfil/Conjunto de permisos) para el usuario
  • Permisos de campo (FLS) para Nombre, Calle de envío y Ciudad de envío para el usuario
  • Configuración de nivel de registro (como valores predeterminados de toda la organización y reglas de colaboración) para el objeto Cuenta para el usuario

El WITH USER_MODE la palabra clave también es compatible con agregar SOQL para hacer cumplir CRUD/FLS y reglas de uso compartido de registros.

<dx-code-block title language code-block="List groupedResults = [SELECT SUM(AMOUNT) total FROM Opportunity WHERE AccountId = :accountId WITH USER_MODE];»>

En el ejemplo anterior, al usar la palabra clave WITH USER_MODE , la consulta respeta estas restricciones de seguridad:

  • Permisos de lectura en el objeto Oportunidad para el usuario
  • Permisos de campo (FLS) para Amount y AccountId (sí, incluso los campos utilizados en la cláusula SOQL WHERE se verifican para FLS) para el usuario
  • Acceso a nivel de registro (como valores predeterminados de toda la organización y reglas de colaboración) en el objeto Oportunidad para el usuario

Para obtener más ejemplos, consulte la clase SOQLRecipes de la aplicación apex-recipes.

Aplicar CRUD/FLS y reglas de uso compartido para SOQL dinámico

Los nuevos métodos Database (ver documentos ) ahora admiten un parámetro AccessLevel que le permite ejecutar operaciones de base de datos en modo de usuario en lugar de en el modo de sistema predeterminado. Veamos un código de ejemplo para ejecutar un SOQL dinámico en el modo de usuario.

<dx-code-block title language code-block="String query = 'SELECT ID, Name FROM Account LIMIT 1';
List lstAccounts = Database.query(query, AccessLevel.USER_MODE);»>

En el ejemplo anterior, el modo de usuario se aplicará de manera similar al ejemplo de SOQL estático que vimos en la sección anterior.

Para obtener más ejemplos, consulte la clase DynamicSOQLRecipes de apex-recipes. Hemos actualizado todos los métodos de la clase para usar el parámetro AccessLevel .

Hacer cumplir CRUD/FLS y reglas de uso compartido para SOSL

WITH USER_MODE o WITH SYSTEM_MODE también son compatibles con declaraciones SOSL (Lenguaje de búsqueda de objetos de Salesforce).

Veamos un ejemplo de una instrucción SOSL estática.

<dx-code-block title language code-block="String keyword = 'Alaska';
List<List> searchResults = [ FIND :keyword IN Name FIELDS RETURNING Account(Name), Contact(LastName, Account.Name) WITH USER_MODE ];»>

En el ejemplo anterior, al usar la palabra clave WITH USER_MODE , la consulta respeta estas restricciones de seguridad:

  • Permisos de lectura en los objetos Cuenta y Contacto para el usuario
  • Permisos de campo (FLS) para el campo Nombre en Cuenta y campo Apellido en Contacto para el usuario
  • Acceso a nivel de registro (como valores predeterminados de toda la organización y reglas de colaboración) en los objetos Cuenta y Contacto para el usuario

Para Dynamic SOSL, los nuevos métodos Search (ver documentos ) también admiten el parámetro AccessLevel similar a los nuevos métodos Database . A continuación se muestra un ejemplo de cómo usar el parámetro AccessLevel para ejecutar SOSL en el contexto de los usuarios.

<dx-code-block title language code-block="String query = 'FIND 'Edge*' IN ALL FIELDS RETURNING Account(ID,Name), Contact, Lead'; List<List> searchResults = Search.query(query, AccessLevel.USER_MODE);»>

Hacer cumplir CRUD/FLS y reglas de uso compartido para DML

Las operaciones de la base de datos pueden especificar el modo de usuario o sistema utilizando las palabras clave as user o as system .

El siguiente es un código de ejemplo que ejecuta DML en el modo de usuario aplicando CRUD/FLS y reglas de uso compartido.

Para Dynamic DML, los desarrolladores pueden utilizar el parámetro AccessLevel para ejecutar operaciones de base de datos en el modo de usuario o en el modo de sistema.

Echemos un vistazo a un ejemplo de la aplicación apex-recipes para ver cómo puede diseñar métodos para que sean genéricos, de modo que el consumidor del método pueda decidir ejecutar el código en el modo de usuario o de sistema.

El fragmento de código siguiente muestra cómo invocar este método en el modo de usuario.

El siguiente fragmento de código muestra cómo invocar este método en el modo de sistema.

Para obtener más ejemplos, consulte la clase DMLRecipes de la aplicación apex-recipes.

Consideraciones importantes

  1. Las operaciones de la base de datos en modo usuario generan excepciones de seguridad si se encuentra una infracción CRUD/FLS. Si tiene un requisito para evitar excepciones y aún aplicar la seguridad, use el método Security.stripInaccessible() (consulte los documentos ). Consulte la clase StripInaccessibleRecipes (ver documentos ) de la aplicación apex-recipes para ver ejemplos de código.
  2. Si usa la palabra clave WITH SECURITY_ENFORCED en sus declaraciones SOQL para hacer cumplir CRUD/FLS, ahora le recomendamos que use la palabra clave WITH USER_MODE en su lugar debido a las siguientes razones:
    1. La consulta SOQL que usa la palabra clave WITH USER_MODE admite muchas innovaciones nuevas, como reglas de restricción, reglas de alcance y cualquier otra operación de seguridad para el acceso a datos y CRUD/FLS, que la plataforma puede agregar en el futuro, por lo que es una especie de prueba del futuro
    2. La consulta SOQL que usa la palabra clave WITH USER_MODE maneja casos de uso de seguridad complejos mucho mejor. Por ejemplo, WITH USER_MODE es compatible con SOSL y consultas polimórficas .
    3. Las declaraciones SOQL que usan la palabra clave WITH USER_MODE manejan CRUD/FLS para los campos usados en la cláusula where y order by o campos usados en la consulta de relación o búsqueda polimórfica
    4. Las consultas SOQL que utilizan la palabra clave WITH USER_MODE funcionan mucho mejor en comparación con el uso WITH SECURITY_ENFORCED
  3. El modo de usuario anula la configuración de nivel de clase para la consulta SOQL o DML escrita en modo de usuario. Exploremos esto con el siguiente código de ejemplo.

<dx-code-block title language code-block="public without sharing ExampleCls { public static List getAccount() { String query = ‘SELECT Id FROM Account Limit 1’; return Database.query(query, AccessLevel.USER_MODE); } }»>

En el ejemplo anterior, aunque la clase Apex está configurada para ejecutarse en el contexto del sistema (sin la palabra clave compartida), la consulta SOQL se ejecuta en el modo de usuario, lo que refuerza la seguridad. El modo de usuario para la operación (SOQL/SOSL o DML) anula el uso compartido a nivel de clase.

2. Pasar dinámicamente variables de vinculación a consultas SOQL

Spring '23 agregó nuevos métodos como Database.queryWithBinds , Database.getQueryLocatorWithBinds y Database.countQueryWithBinds .

Estos métodos proporcionan los siguientes beneficios:

  • Anteriormente, si los desarrolladores usaban variables de vinculación en SOQL dinámico (usando el método Database.query ) que están fuera de contexto, la consulta no podía resolver las variables. Con queryWithBinds , las variables de vinculación de la consulta se resuelven directamente desde un parámetro Map con una clave en lugar de variables de código de Apex.
  • Con Database.queryWithBinds , los ataques de inyección SOQL se evitan automáticamente.

Echemos un vistazo a un ejemplo de código para comprender el segundo punto con más profundidad.

<dx-code-block title language code-block="public static List simpleBindingSoqlQuery(Map bindParams) { String query = ‘SELECT Id, Name ‘ + ‘FROM Account ‘ + ‘WHERE name = :name’; return Database.queryWithBinds( query, bindParams, AccessLevel.USER_MODE );
}»>

El código anterior ejecuta un SOQL dinámico en el modo de usuario. El método acepta un parámetro Map y se puede llamar usando el código a continuación.

<dx-code-block title language code-block="String accountName = 'Codey And Co';
Map nameBind = new Map{‘name’ => accountName};
List accounts = simpleBindingSoqlQuery(nameBind);
System.debug(accounts);»>

Tenga en cuenta que no es necesario que nos aseguremos de que el nombre de la variable esté en el mismo ámbito de método que la consulta dinámica. Además, no es necesario usar el método String.escapeSingleQuotes para el valor en la variable name cuando se usa queryWithBinds .

Para obtener más ejemplos de código, consulte esta solicitud de incorporación de cambios en nuestro repositorio de GitHub apex-recipes.

3. Especifique un retraso en la programación de trabajos en cola

Otra característica importante que lanzamos en Spring '23 es la capacidad de especificar demoras para trabajos programados que se pueden poner en cola.

Puede ser beneficioso ajustar el tiempo antes de que se ejecute el trabajo en cola en los siguientes casos de uso:

  • Si el sistema externo tiene una velocidad limitada y puede sobrecargarse con trabajos en cola encadenados que realizan llamadas rápidas
  • Al sondear los resultados, y ejecutar demasiado rápido puede provocar el uso desperdiciado de los límites diarios de Apex asíncrono

Usa el método System.enqueue(queueable, delay) (ver docs ) para especificar retrasos. Los retrasos pueden variar de cero a 10 minutos. Veamos un ejemplo para comprender mejor esta función.

El ejemplo anterior agrega un trabajo para la ejecución asincrónica retrasada al pasar una instancia de la implementación de su clase de la interfaz Queueable para la ejecución. Hay un retraso mínimo de cinco minutos antes de que se ejecute el trabajo.

Especificar un retraso predeterminado en toda la organización en la programación de trabajos en cola

Actualmente, si tiene un trabajo en cola de Apex, utiliza el tiempo estándar en cola sin demoras adicionales. Los administradores pueden definir un retraso predeterminado en toda la organización para todos los trabajos en cola que no especifican retraso usando
System.enqueue(queueable, delay) . Este es principalmente un mecanismo para manejar trabajos fuera de control que podrían estar ejecutándose demasiado rápido.

Importante consideración

Cuando establece el retraso en 0 (cero), el trabajo en cola se ejecuta lo más rápido posible. Con trabajos en cola encadenados, implemente un mecanismo para ralentizar o detener el trabajo si es necesario. Sin un mecanismo a prueba de fallas de este tipo, puede alcanzar rápidamente el límite de Apex asíncrono diario.

También hay una próxima función Beta en la versión Summer '23 (planificada para estar disponible el 10 de junio de 2023 en todas las organizaciones) que permite a los desarrolladores controlar la profundidad de los trabajos en cola encadenados.

4. Obtenga el SObject de origen de una instancia DescribeFieldResult usando el nuevo método getSObjectType

El método getSObjectType (ver documentos ) en el objeto DescribeFieldResult (ver documentos ) es un método de mejora de la calidad de vida del desarrollador que se implementó en Spring '23.

Anteriormente, los desarrolladores tenían que hackear y escribir código adicional para obtener el objeto de origen de la información del esquema de campos obtenida a través de la descripción del campo. Puede consultar las soluciones anteriores a través de esta publicación de stackexchange .

A continuación se muestra un ejemplo de código de cómo usar el nuevo método getSObjectType .

Con el método getSObjectType , los desarrolladores ya no tienen que pasar el nombre del objeto como una cadena. Consulte un ejemplo más completo en las notas de la versión de Spring '23.

Actualizaciones de herramientas

Hemos actualizado el servidor de idioma de Apex para admitir las últimas adiciones de sintaxis, como insert as user, insert as system y mucho más. Y ahora admitimos las últimas adiciones de sintaxis en el lanzamiento reciente de las Extensiones de Salesforce para VSCode .

También quiero agradecer a Dang Mai por actualizar el complemento más bonito para Apex (usado para formatear el código Apex automáticamente) para admitir todas las palabras clave introducidas para las operaciones de la base de datos en modo usuario.

Conclusión

En conclusión, la versión Spring '23 de Salesforce incluye varias actualizaciones. Mediante el uso de estas nuevas funciones, los desarrolladores pueden crear aplicaciones más eficaces y seguras para sus organizaciones.

Los equipos de productos de Apex no se detienen ahí y hay más innovaciones en la hoja de ruta. Puede obtener una vista previa de lo que viene para Apex en Summer '23 (nuestro próximo lanzamiento) en la vista previa de las notas de la versión . También recomiendo ver la grabación de la sesión TrailblazerDX '23, Apex: What's New and What's Coming , para aprender más sobre lo que se está cocinando.

Referencias adicionales

Sobre el Autor

Mohith Shrivastava es promotor de desarrollo en Salesforce con una década de experiencia en la creación de productos a escala empresarial en la plataforma de Salesforce. Actualmente se está enfocando en las herramientas para desarrolladores de Salesforce, Flow, Apex y Lightning Web Components en Salesforce. Mohith se encuentra actualmente entre los principales contribuyentes en Salesforce Stack Exchange, un foro de desarrolladores donde los desarrolladores de Salesforce pueden hacer preguntas y compartir conocimientos. Puedes seguirlo a través de su Twitter @msrivastav13 .

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

Seguir leyendo

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

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();
Seguir leyendo

Retrospectiva de un desarrollador de plataforma de TrailblazerDX '23 ☁️

Retrospectiva de un desarrollador de plataforma de TrailblazerDX '23 ☁️

TrailblazerDX '23 estuvo lleno de innovación y contenido para los desarrolladores. En este blog, la perspectiva de un desarrollador de Salesforce Platform y una lista de recursos de TDX.

La publicación Retrospectiva de un desarrollador de plataforma de TrailblazerDX '23 apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo

Prepare su aplicación para pasar la revisión de seguridad de AppExchange ☁️

Prepare su aplicación para pasar la revisión de seguridad de AppExchange ☁️

Esta guía se publicó originalmente en Medium en 2021 y se actualizó con la orientación y los consejos más recientes, incluidas las nuevas funciones de seguridad como parte de los lanzamientos recientes y la nueva estructura de precios para las revisiones.

La publicación Prepare su aplicación para pasar la revisión de seguridad de AppExchange apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo

Einstein GPT para desarrolladores de Salesforce ☁️

Las herramientas impulsadas por IA están cambiando la forma en que escribimos y analizamos el código. Descubra cómo Einstein GPT cambiará el panorama de desarrollo de software con Salesforce.

La publicación GPT de Einstein para desarrolladores de Salesforce apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo

Mejore la disponibilidad en su organización ☁️

Esté atento a estos antipatrones comunes y utilice estas estrategias para evitarlos y mejorar la disponibilidad en su organización.

La publicación Mejore la disponibilidad en su organización apareció por primera vez en el blog de desarrolladores de Salesforce .

Seguir leyendo

Ahora en Pilot: adaptador de cable GraphQL para LWC ☁️

El adaptador de cable GraphQL está en fase piloto a partir de la versión Spring '23. Descubra cómo hace que acceder a los datos de los LWC sea más fácil que nunca.

La publicación Now in Pilot: GraphQL Wire Adapter for LWC apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo

Mejore el rendimiento del código con el analizador de código de Salesforce ☁️

Estamos desarrollando Salesforce Graph Engine con nuevas reglas para ayudarlo a mejorar el rendimiento de su código en la última versión 3.9 de Code Analyzer.

La publicación Aumente el rendimiento del código con Salesforce Code Analyzer apareció por primera vez en el blog de desarrolladores de Salesforce .

Seguir leyendo

Dé forma al futuro de la construcción y el desarrollo en Salesforce ☁️

Nuestra encuesta global anual para desarrolladores nos ayuda a saber cómo construye usando los productos de Salesforce, para que podamos mejorar su experiencia al usarlos.

La publicación Da forma al futuro de la construcción y el desarrollo en Salesforce apareció por primera vez en el blog de desarrolladores de Salesforce .

Seguir leyendo

La guía para desarrolladores de TrailblazerDX '23 ☁️

Vea lo que TrailblazerDX '23 tiene reservado para desarrolladores en todo el ecosistema de Salesforce, ya sea que se una a nosotros en San Francisco o en Salesforce+.

La publicación La guía para desarrolladores de TrailblazerDX '23 apareció por primera vez en el blog de desarrolladores de Salesforce .

Seguir leyendo

Resumen de 2022: nuevas funciones para desarrolladores del año pasado ☁️

Cada año, los desarrolladores de Salesforce se encuentran en el extremo receptor de una cinta transportadora de funciones nuevas importantes y, a veces, esenciales de la plataforma de Salesforce.

La publicación 2022 en revisión: nuevas funciones para desarrolladores del año pasado apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo

Comience a crear aplicaciones de Salesforce ahora con un nuevo proyecto de Trailhead ☁️

Los desarrolladores valoran y confían en Salesforce Platform porque simplifica el proceso de creación de soluciones empresariales seguras. Al utilizar las herramientas y los servicios integrados de la plataforma para la automatización, la integración y más, los desarrolladores pueden lograr el éxito comercial más rápido. Los desarrolladores de Salesforce abordan problemas comerciales complejos escribiendo código y utilizando herramientas sin código que ofrecen funciones simples rápidamente. Los […]

La publicación Comenzar a crear aplicaciones de Salesforce ahora con un nuevo proyecto de Trailhead apareció primero en el blog de desarrolladores de Salesforce .

Seguir leyendo