Skip to content

Etiqueta: apex

Diseñe una API Swagger con código para traer datos a Salesforce ☁️

Diseñe una API Swagger con código para traer datos a Salesforce ☁️

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

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

Diseñe una API de Swagger con código para llevar datos a Salesforce | Blog de desarrolladores de Salesforce

La integración de una API externa con su organización de Salesforce puede ser una tarea sencilla que no requiere código si utilizaCredenciales con nombre y Servicios externos . Deberá crear una credencial con nombre que apunte a la API y configurar un servicio externo en la interfaz de usuario de configuración. La clave aquí es proporcionar una especificación OpenAPI para la API. Si la API no tiene una, puede diseñarla usted mismo manualmente usando YAML o JSON, usar MuleSoft Anypoint Platform o aprovechar las herramientas y el código de código abierto.

En esta publicación, le presentaremos la especificación OpenAPI y Swagger, discutiremos los elementos principales de la especificación y lo guiaremos a través del diseño e implementación de una API con código. Usaremos Node.js y Swagger dentro del marco Fastify para esta tarea. Finalmente, integraremos esta API con Salesforce.

OpenAPI y Swagger

OpenAPI es una especificación para diseñar y construir API. Proporciona una forma estandarizada de definir su API para otros, brindando una forma estructurada que incluye puntos finales, tipos de solicitud/respuesta, definiciones de esquema, métodos de autenticación y más. Las especificaciones de OpenAPI están escritas en formatos YAML o JSON, ambos fáciles de leer y escribir. Esta especificación es ampliamente adoptada y respaldada por una variedad de herramientas, lo que la convierte en una opción popular para diseñar y documentar API. De hecho, si desea importar una API a Salesforce utilizando servicios externos, deberá especificarse con OpenAPI. Además, Salesforce es miembro de la Iniciativa OpenAPI .

Nota: A la fecha de esta publicación, la versión actual de la especificación OpenAPI es 3.1.0.

Swagger , por otro lado, es un conjunto de herramientas ( la mayoría de código abierto ) para implementar la especificación OpenAPI. Incluye la interfaz de usuario de Swagger, que proporciona una interfaz gráfica para comprender y probar las API, y Swagger Codegen, que genera código SDK de cliente y apéndices de servidor a partir de una especificación OpenAPI.

La especificación OpenAPI v2 también se conoce como Swagger, pero su nombre cambió cuando se convirtió en parte de la iniciativa OpenAPI en 2016.

Estructura básica de la especificación OpenAPI

La especificación OpenAPI está organizada en las siguientes secciones clave:

API abierta Define el documento raíz y combina la lista de recursos y la declaración de la API. Requerido
Información Proporciona metadatos sobre la API, como el título, la descripción, los términos del servicio, la información de contacto, etc. Obligatorio
Servidores Especifica una o más URL base para su API, como producción o preparación.
Seguridad Define un esquema de seguridad que pueden utilizar las operaciones de la API.
Caminos Describe las rutas y operaciones disponibles para la API. Cada ruta tiene un método HTTP con los detalles de la operación.
Etiquetas Agrega metadatos a una sola etiqueta que utiliza el objeto de operación.
Documentos externos Proporciona una descripción y una URL para la documentación externa.
Componentes Define un conjunto de objetos reutilizables para diferentes aspectos de la API. Esto puede incluir esquemas, respuestas, parámetros, ejemplos, cuerpos de solicitud, encabezados, esquemas de seguridad, etc.

Para obtener una explicación más detallada de cada sección y sus correspondientes definiciones de objeto, consulte la documentación oficial de la especificación OpenAPI .

Para fines de demostración, crearemos una API para administrar una librería. Esta API contará con dos métodos HTTP: uno para enumerar los libros disponibles y otro para agregar nuevos libros. A continuación, encontrará una definición básica de esta API, centrándose en el método para listar libros ( GET /books ) y sus objetos de respuesta.

Tenga en cuenta que estamos usando tres secciones principales aquí: Información , Rutas y Componentes . Como se mencionó anteriormente, describiremos esta API a medida que la implementemos mediante código. Para este propósito, utilizaremos Fastify y Fastify Swagger.

Fastify y Fastify Swagger

Fastify es un marco web altamente eficiente y flexible para Node.js. Está diseñado para facilitar su uso y ofrecer la máxima velocidad sin comprometer la personalización. Fastify proporciona una base sólida para las aplicaciones web y las API, con funciones como la validación de solicitudes y respuestas basadas en esquemas, ganchos, complementos y registro automático. Una de sus principales ventajas radica en su ecosistema, que incluye numerosos complementos centrales y mantenidos por la comunidad.

Uno de estos complementos es fastify-swagger . Este complemento nos permite ofrecer definiciones de Swagger (OpenAPI v2) u OpenAPI v3, que se generan automáticamente a partir de sus esquemas de ruta o de una definición existente de Swagger/OpenAPI. Además, utilizará fastify-swagger-ui , un complemento que sirve una instancia de Swagger UI dentro de su aplicación.

Nota: La siguiente demostración requiere la instalación de Node.js LTS y, a la fecha de esta publicación de blog, la última versión es v18.16.0.

Comencemos a crear la API de su librería instalando Fastify CLI y generando un nuevo proyecto ejecutando:

Luego, vayamos a la carpeta del proyecto e instalemos las dependencias fastify-swagger y fastify-swagger-ui .

Nota: En esta demostración, se centrará en tres aspectos principales: agregar compatibilidad con Swagger a Fastify, definir rutas de API y delinear esquemas y tipos de respuesta. No explicaremos cómo integrar la API con una base de datos. Si está interesado en explorar la fuente completa del proyecto, está disponible en el repositorio de ejemplos de codeLive.

Agreguemos compatibilidad con Swagger a Fastify editando el archivo app.js , luego importemos Swagger y SwaggerUI y registrémoslos como complementos.

aplicación.js

En la configuración del complemento de Swagger, tiene la opción de pasar toda la definición de especificación de OpenAPI, o puede aprovechar el enfoque dinámico que ofrece el complemento. Para esta demostración, utilizará el enfoque dinámico. Dado que el único campo obligatorio es info , definirá los metadatos de su API allí, además, la sección refResolver se encarga de nombrar las referencias de definición de esquema.

Y para SwaggerUI, solo especifica la ruta donde se alojará el sitio de documentación.

Ahora vamos a crear una carpeta schemas . Aquí es donde definirá los esquemas de su API. Para esta demostración, definirá un esquema book y un esquema error .

esquemas/index.js

Los esquemas representan la estructura de los objetos con los que trabajará, tanto para los cuerpos de solicitud como para los de respuesta. Para la especificación OpenAPI, el complemento Swagger agregará automáticamente estos objetos en el campo components .

Finalmente, definamos las rutas API para GET /books y POST /books usando Fastify. Primero, deberá registrar los esquemas dentro de Fastify. Luego, especificará los objetos de respuesta y solicitud para cada ruta que haga referencia a esos esquemas.

rutas/root.js

{ // … look at the code repository for a complete implementation } ) // POST /books fastify.post( ‘/books’, { schema: { description: "Create a book", body: { $ref: ‘book#’, required: [‘author’, ‘title’] }, response: { 201: { description: ‘Returns the book that has been created’, $ref: ‘book#’ }, 500: { description: ‘Returns an error’, $ref: ‘error#’ } } } }, async (request, reply) => { const { title, author } = request.body const id = randomUUID() const client = await fastify.pg.connect() try { const { rows: books } = await client.query( ‘INSERT INTO books(id, title, author) VALUES($1, $2, $3) RETURNING *’, [id, title, author] ) const [newBook] = books reply.code(201).send(newBook) } catch (error) { reply .status(500) .send({ code: 500, message: `An error ocurred: ${error.message}` }) } finally { client.release() } } ) // GET / fastify.get(‘/’, { schema: { hide: true } }, async function (request, reply) { reply.status(301).redirect(‘/api-docs’) })
} «>

Analicemos la ruta POST /books :

  • La función fastify.post define el método HTTP.
  • El primer argumento especifica la ruta: /books.
  • El segundo argumento especifica el schema , que incluye el body : el objeto de carga útil que espera la API. (Tenga en cuenta que es una referencia al esquema del book ). También incluye varios objetos response para esa ruta, que se asignan a los códigos de estado HTTP correspondientes 201 y 500 .
  • El tercer argumento es la implementación de la ruta. En este caso, está insertando el objeto en la base de datos y devolviendo el nuevo objeto. Si este proceso falla, devolverá un objeto de error. Es importante tener en cuenta que está utilizando los mismos esquemas que definió anteriormente.

Nota: También tiene la opción de excluir ciertas rutas de la documentación pasando hide: true en el objeto de esquema de esa ruta específica, como se demuestra en GET / route.

Su API está lista, así que ejecútela localmente para echar un vistazo a la interfaz de SwaggerUI ejecutando:

Y navegue a http://localhost:3000/api-docs para ver las diferentes rutas, su documentación y tener una forma de probarlas directamente desde la interfaz.

Si desea probarlo e implementarlo en Heroku, asegúrese de actualizar el script start en el archivo package.json con lo siguiente.

Además, asegúrese de tener acceso a una base de datos Heroku PostgreSQL y cree el esquema de la base de datos ejecutando:

<dx-code-block title language code-block="heroku pg:psql

Nota: El archivo database.sql está disponible en el repositorio de ejemplos de codeLive.

Luego puede implementarlo ejecutando:

Si desea ver cómo se ve implementado, vea mi versión que se ejecuta en Heroku .

Integración de una API externa con Salesforce

Ahora que tiene una API de acceso público, integrémosla con Salesforce como un servicio externo.

Primero, deberá crear una credencial con nombre para esta API. En la interfaz de usuario de configuración, vaya a Seguridad > Credenciales con nombre y cree una credencial externa con un protocolo de autenticación personalizado y una entidad de seguridad.

Asegúrese de que la credencial externa tenga una entidad principal a la que le haya asignado permisos en Acceso principal de credenciales externas en su conjunto de permisos.

Luego, cree una credencial con nombre que haga referencia a la credencial externa con la URL que apunta a la API pública.

A continuación, vaya a Integraciones > Servicios externos y agregue un nuevo servicio externo desde una especificación de API, seleccione la credencial con nombre y configure la ruta relativa a la ruta de especificación de OpenAPI. En su demostración, será /api-docs/json .

Después de eso, guarde sus cambios y seleccione las operaciones que desea importar a Salesforce, revise las operaciones y finalice.

Como puede ver, las operaciones que ha seleccionado se han importado correctamente, especificando tanto los parámetros de entrada como los de salida.

Ahora podrá invocar este servicio externo desde Flow, Apex, Einstein Bots y OmniStudio.

Conclusión

OpenAPI y los servicios externos de Salesforce brindan una poderosa combinación para integrar API externas en su organización de Salesforce. Al aprovechar el enfoque estandarizado de OpenAPI para definir las API y la capacidad de Salesforce para consumir fácilmente estas definiciones e invocarlas desde soluciones de código bajo y pro-código, los desarrolladores como usted pueden optimizar el proceso de conexión a servicios externos y mejorar las capacidades de sus aplicaciones de Salesforce.

Si está interesado en obtener más información sobre los servicios externos , puede encontrar una lista de recursos de aprendizaje a continuación, incluidos videos que muestran cómo invocarlos desde Flow y Apex.

Recursos de aprendizaje

Sobre el Autor

Julián Duque es un defensor principal de desarrolladores en Salesforce, donde se enfoca en Node.js, JavaScript y desarrollo backend. Le apasiona la educación y el intercambio de conocimientos y ha estado involucrado en la organización de comunidades tecnológicas y de desarrolladores desde 2001.

Sígalo en Twitter @julian_duque, @julianduque.co en Bluesky social o LinkedIn.

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

Agregar a Slack Suscríbete a RSS

Seguir leyendo

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

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

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

Gran idea o pregunta duradera:

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

Objetivos:

Después de leer este blog, podrá:

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

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

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

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


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

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

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

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

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

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

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

Práctica guiada (nosotros hacemos):

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

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

Comprobar si una cadena es nula, vacía o en blanco en Apex

Comprobar si una cadena es nula, vacía o en blanco en Apex

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

Gran idea o pregunta duradera:

  • ¿Cómo verificar en Apex si un campo de Texto es nulo, vacío o en blanco?

Objetivos:

Después de leer este blog, podrá:

  • Diferenciar entre nulo, vacío y en blanco
  • Comprobar si un campo de campo de texto es nulo
  • Comprobar si un campo de campo de texto está vacío
  • Comprobar si un campo de campo de texto está en blanco
  • y mucho más

Ben Halpern es un desarrollador Jr. de Salesforce en Gurukul On Cloud (GoC) . Ben quiere aprender a verificar si un campo de texto es nulo, está vacío o está en blanco en Apex.

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

Es muy fácil confundir una cadena nula, vacía o en blanco para los principiantes. Sin embargo, vayamos por la definición de cada uno para trazar una línea de diferencia.

  1. Nulo : Significa que una variable o campo no tiene un valor asignado. Por ejemplo:
     String myStr1 = null;
  2. Vacío : Significa que a una variable o campo se le ha asignado un valor, pero ese valor es una cadena vacía con cero caracteres. Por ejemplo:
     Cadena miStr2 = '';
Seguir leyendo

Herramientas para desarrolladores desde cero (Parte 1 de 2) ☁️

Herramientas para desarrolladores desde cero (Parte 1 de 2) ☁️

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.

Herramientas para desarrolladores desde cero (Parte 1 de 2) | Blog de desarrolladores de Salesforce

Tanto si es un nuevo desarrollador que acaba de empezar su carrera en el ecosistema de Salesforce como si es un desarrollador experimentado de Salesforce que aún no se ha cambiado a nuestras nuevas herramientas para desarrolladores, esta serie de publicaciones de blog es para usted. Le mostraremos cómo configurar y utilizar las herramientas que pueden ayudar a todos los desarrolladores de Salesforce a ser mucho más productivos y felices.

Antes de que empieces

Si es nuevo en Salesforce y no tiene una organización (instancia de Salesforce) disponible para practicar, regístrese en una organización Developer Edition . Es completamente gratis y tiene la mayoría de las funciones de Salesforce preinstaladas para que pruebe y aprenda. Deberá proporcionar un nombre de usuario en forma de dirección de correo electrónico, pero no es necesario que sea uno real. Es solo un nombre de usuario que debe ser único en todos los productos de Salesforce. Después de solicitar una organización, recibirá un correo electrónico con los pasos para iniciar sesión. Tome nota del nombre de usuario de la organización que proporcionó, ya que tendrá que usarlo más adelante.

Si es un desarrollador de Salesforce establecido y un usuario de Developer Console, este es el momento adecuado para adoptar las nuevas herramientas de desarrollador. Si bien Developer Console puede ser una forma rápida de cambiar algunas líneas de código, usar las herramientas más modernas cambiará las reglas del juego, ya que incluyen un montón de capacidades que simplificarán su trabajo. Usar las nuevas herramientas requiere un cambio de hábitos al principio, pero te prometo que muy pronto entenderás sus beneficios. Además, tenga en cuenta que ya no estamos invirtiendo en Developer Console, y problemas como la falta de soporte para Lightning Web Components son algo que no abordaremos.

Instalación de las herramientas de desarrollador

Los metadatos de su organización están en la nube, pero para desarrollarse de una manera más productiva, desarrollará localmente. El modus operandi será trabajar con los metadatos en su máquina local y sincronizarlos con su organización, lo que significa recuperarlos o implementarlos cuando sea necesario.

Una alternativa al desarrollo local es usar Code Builder (Beta) , un IDE basado en web que puede iniciar desde su organización y que tiene las herramientas de desarrollador instaladas. Sin embargo, en este blog, nos centraremos en el flujo de trabajo de desarrollo local.

El primer paso es instalar las siguientes herramientas en su máquina:

  • CLI de Salesforce : esta es la herramienta de interfaz de línea de comandos que utilizará para escribir comandos para mover su código entre su entorno local y su organización, ejecutar pruebas, implementar datos de muestra y mucho más. Si no le gusta escribir comandos en una terminal, no tema, ya que tenemos opciones alternativas como se describe en esta publicación de blog.
  • Código VS : este es el IDE que usará para desarrollar en su máquina local.
  • Java : algunas funciones en las extensiones de Salesforce para VS Code dependen de la plataforma Java, kit de desarrollo de edición estándar (JDK). Instálelo siguiendo las instrucciones vinculadas.
  • Extensiones de Salesforce para VS Code : Este es un grupo de extensiones de VS Code que aumentan las capacidades de VSCode, exponiendo la mayoría de los comandos de la CLI de Salesforce en la interfaz de usuario de VS Code, para que pueda ejecutarlos con clics. Las extensiones también agregan funciones para habilitar la depuración, facilitar las pruebas, permitirle explorar los metadatos en su organización y más.

Creación de un proyecto de Salesforce DX

Cuando trabaja con los metadatos de una organización localmente, los archivos de metadatos deben almacenarse en una carpeta de proyecto, siguiendo una estructura determinada. Eso es lo que llamamos un proyecto de Salesforce DX.

Una vez instaladas las herramientas para desarrolladores, puede continuar y crear un proyecto de Salesforce DX que luego conectará a su organización. Una forma de hacerlo es escribir un comando que utilice la CLI de Salesforce para crear el proyecto. Puede escribir ese comando en una terminal normal.

sf project generate -n myProject

Nota: la CLI de Salesforce contiene dos ejecutables, sfdx y sf . En este blog, escribiremos los comandos utilizando el ejecutable y la sintaxis más modernos, que es sf .

El indicador -n indica el nombre del proyecto. La CLI de Salesforce aplicará scaffolding a un proyecto en una carpeta con ese nombre. Una vez que se crea el proyecto, puede abrirlo en VS Code, con File → Open Folder .

Gracias a las extensiones de Salesforce para VS Code, existe una forma sin escribir para ejecutar los comandos de la CLI de Salesforce. Simplemente abra la paleta de comandos de VS Code con View → Command Palette y escriba SFDX para ver todos los comandos disponibles. También podríamos haber creado el proyecto con SFDX: Create Project en lugar de escribir el comando.

Autorizar y establecer una organización como predeterminada

Una vez que su proyecto esté configurado, el siguiente paso es autorizar la CLI de Salesforce para que funcione con su organización. Comencemos esta vez con la forma de hacerlo sin escribir. Cuando abra el proyecto por primera vez, simplemente haga clic en el botón Sin conjunto de organizaciones predeterminado y aparecerá la paleta de comandos, sugiriendo que autorice una organización. Proceda siguiendo las instrucciones del comando.

Otra forma de hacerlo es ejecutar un comando CLI de Salesforce. Esta vez, y de ahora en adelante, le recomiendo que use el terminal integrado de VS Code para ejecutar comandos, ya que tener todas las herramientas en la misma pantalla reduce el cambio de contexto. Puede abrirlo en Terminal → New Terminal .

El comando CLI de Salesforce utilizado para autorizar una organización es:

sf org login web -s

Luego, siga las instrucciones dadas por el comando. El indicador -s configurará esa organización como su organización predeterminada para este proyecto. Puede ver la organización predeterminada de su proyecto en la barra inferior de VS Code.

Todos los comandos de la CLI de Salesforce tienen varios indicadores disponibles. Por ejemplo, si desea conectarse a una zona de pruebas, puede pasar la URL de la instancia de la zona de pruebas a sf org login web usando -r . Para ver la ayuda del comando y todos sus indicadores disponibles, ejecute el comando agregando --help al final.

Cuando trabaja con varias organizaciones, será común autorizar la CLI de Salesforce con varias organizaciones. Puede ver las organizaciones a las que la CLI de Salesforce tiene autorización para acceder ejecutando sf org list . Puede cambiar la organización predeterminada de un proyecto haciendo clic en el nombre de la organización en la barra inferior de VS Code, como hicimos para autorizar por primera vez, o ejecutando:

sf config set target-org=your-org-username@sf.com

Permítanme compartir con ustedes un último consejo. Las organizaciones pueden tener alias. Esto es útil cuando no desea recordar nombres de usuario largos o complejos. Para establecer un alias, escriba el siguiente comando.

sf alias set myalias=your-org-username@sf.com

Cuando se establece un alias, puede utilizar el alias en lugar del nombre de usuario de la organización en cualquiera de los comandos de la CLI de Salesforce.

Implementación de metadatos en la organización

Una vez que la CLI de Salesforce y su IDE estén autorizados con su organización, y la organización esté configurada como la organización predeterminada para su proyecto, puede comenzar a desarrollar e implementar cambios. Por ejemplo, digamos que queremos crear una clase de Apex. Puede crear el archivo de metadatos que representa la clase de Apex manualmente en la carpeta classes . Sin embargo, es mucho más efectivo crear la clase desde la paleta de comandos.

También puede crear una clase escribiendo el siguiente comando de la CLI de Salesforce:

sf apex generate class -n myClass -d force-app/main/default/classes

Una vez que su clase esté lista para implementarse en su organización, hay varias formas de hacerlo. Una forma es especificar los metadatos en el comando.

sf project deploy start -m ApexClass

Una segunda forma es especificar una carpeta para implementar.

sf project deploy start -p force-app/main/default/classes

Y una tercera forma, disponible gracias a Salesforce Extensions for VS Code, es hacer clic con el botón derecho en el archivo y hacer clic en Deploy This Source to Org .

Todas esas opciones le permiten ejecutar las implementaciones usted mismo. Si desea automatizar este paso e implementar un archivo cada vez que se guarda, puede establecer la configuración Implementar al guardar VS Code en "Verdadero" y ahorrar algo de tiempo.

Cuando se implementan sus metadatos, normalmente querrá abrir su organización para realizar pruebas. Puede iniciar sesión utilizando su navegador como de costumbre. Pero para los desarrolladores, es más eficiente hacer clic en el botón de abrir organización en la barra inferior de VS Code.

Conclusión

En esta publicación de blog, aprendió cómo obtener una organización gratuita para el desarrollo y cómo instalar las herramientas de desarrollo que todo desarrollador de Salesforce debería usar hoy. Ha entendido cómo crear un proyecto y autorizarlo con su organización y, por último, cómo implementar metadatos mediante la CLI de Salesforce o VS Code. En la Parte 2 de esta serie, aprenderá cómo recuperar metadatos, trabajar con organizaciones con seguimiento de origen y usar bibliotecas de Node para cuidar la calidad de su código. Además, compartiremos otras gemas ocultas de las extensiones de Salesforce para VS Code. Si te gusta un formato de video, mira nuestro episodio de codeLive . Y si tiene preguntas, no dude en hacerlas en Salesforce Developers Trailblazer Community . ¡Estén atentos para la segunda publicación de blog de esta serie mañana!

Sobre el Autor

Alba Rivas trabaja como Principal Developer Advocate en Salesforce. Puedes seguirla en Linkedin , Twitter o GitHub .

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

Herramientas para desarrolladores desde cero (Parte 2 de 2) ☁️

Herramientas para desarrolladores desde cero (Parte 2 de 2) ☁️

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.

Herramientas para desarrolladores desde cero (Parte 2 de 2) | Blog de desarrolladores de Salesforce

Tanto si es un nuevo desarrollador que acaba de empezar su carrera en el ecosistema de Salesforce como si es un desarrollador experimentado de Salesforce que aún no se ha cambiado a nuestras nuevas herramientas para desarrolladores, esta serie de publicaciones de blog es para usted. Le mostraremos cómo configurar y utilizar las herramientas que pueden ayudar a todos los desarrolladores de Salesforce a ser mucho más productivos y felices.

En la Parte 1 de esta serie , discutimos cómo obtener una organización gratuita para el desarrollo y cómo instalar las herramientas de desarrollo que todo desarrollador de Salesforce debería usar hoy. Le mostramos cómo crear un proyecto y autorizarlo con su organización y, finalmente, cómo implementar metadatos mediante la CLI de Salesforce o VS Code. En esta segunda publicación de blog, aprenderá cómo recuperar metadatos, trabajar con organizaciones con seguimiento de origen y usar bibliotecas de Node para cuidar la calidad de su código. Además, compartiremos otras gemas ocultas de las extensiones de Salesforce para VS Code. ¡Vamos a sumergirnos en él!

Recuperar metadatos de la organización

Un pilar del desarrollo de Salesforce es ser eficiente sin reinventar la rueda. Es por eso que hay muchas herramientas de código bajo disponibles que le permiten crear y modificar metadatos directamente en su organización con solo hacer clic. Es posible que vea estas herramientas a las que se hace referencia como herramientas de "apuntar y hacer clic" o herramientas "declarativas". Algunos metadatos típicos que crea con clics son páginas, aplicaciones y flujos.

Estos metadatos son algo que puede recuperar en su proyecto local y continuar ampliándolos con código si es necesario. De hecho, la mejor práctica es recuperar los metadatos de su organización y almacenarlos en un sistema de control de versiones como Git. Pero dejemos este tema para otra entrada del blog.

Si crea o modifica metadatos con clics en su organización y conoce el nombre del tipo de metadatos que desea recuperar, puede hacerlo ejecutando este comando:

sf project retrieve start -m FlexiPage

Los nombres de los tipos de metadatos pueden no ser obvios al principio. Afortunadamente, hay algo muy bueno que puede usar para ver todos los metadatos que existen en su organización y recuperar lo que necesita: Org Browser. El navegador de la organización se agrega a VS Code gracias a las extensiones de Salesforce para VS Code. Ábralo haciendo clic en el ícono de la nube en el panel lateral izquierdo de VS Code, busque los metadatos que necesita y simplemente haga clic en recuperar.

Puede encontrar una lista completa de nombres de tipos de metadatos en la Guía para desarrolladores de la API de metadatos .

Una última opción: si los metadatos ya existen en su proyecto local y desea recuperar una versión actualizada, puede hacer clic con el botón derecho en el archivo y seleccionar Retrieve Source from Org .

Un requisito común para las organizaciones existentes será recuperar todos los metadatos de la organización por primera vez y almacenarlos en el proyecto local (y, por lo general, en un sistema de control de versiones). Este es un tema más avanzado, pero si quieres aprender cómo hacerlo, te recomiendo ver este video Quick Take .

Trabajar con organizaciones con seguimiento de origen

En esta publicación de blog, nos hemos centrado en las organizaciones que no tienen activado el seguimiento de fuentes. Esta es la opción predeterminada para las organizaciones y sandboxes de desarrolladores, aunque, en los sandboxes de desarrolladores, se puede activar el seguimiento de origen. Existe otro tipo de organización, denominada organización borrador, que tiene activado el seguimiento de origen de forma predeterminada.

La principal diferencia con las organizaciones con seguimiento de origen, con respecto a la implementación y recuperación de código, es que los cambios de metadatos se rastrean automáticamente. Eso significa que puede simplificar los comandos de implementación y recuperación, simplemente escribiendo:

sf project deploy start

o

sf project retrieve start

La CLI detectará automáticamente todo lo que haya cambiado en su organización o en su proyecto local y lo implementará o recuperará en consecuencia. Este es un cambio de juego para los desarrolladores, ya que no tener que especificar los metadatos o la carpeta para recuperar o implementar lo convierte en un desarrollador mucho más productivo. Lea la documentación para comenzar con el seguimiento de fuentes en Sandboxes u organizaciones Scratch .

Cuidando la calidad del código con las bibliotecas de Node

Cuando genera un proyecto, también contendrá un archivo package.json . Este archivo define el proyecto como un proyecto de Node.js. La CLI de Salesforce y la Extensión de Salesforce para su IDE estructuran el proyecto de esta manera, para que pueda ejecutar secuencias de comandos que cuidan la calidad de su código. Los scripts usan bibliotecas que se definen en la sección devDependencies de package.json y deben descargarse en su proyecto local ejecutando el comando npm install . Ninguna de las bibliotecas de Node se implementará en su organización, solo se usarán en su máquina local.

Aquí hay un resumen de lo que hacen las bibliotecas:

  • Prettier se usa para formatear su código siguiendo criterios configurables. Esto es extremadamente útil cuando varios desarrolladores trabajan en el mismo proyecto, ya que tienen una forma unificada y automatizada de formatear el código. También proporcionamos un complemento Prettier específico para formatear las clases de Apex.
  • ESLint lo ayuda a encontrar y solucionar problemas con su código JavaScript. Además, proporcionamos un complemento ESLint diseñado para filtrar el código JavaScript de Lightning Web Components.
  • sfdx-lwc-jest se utiliza para escribir y ejecutar pruebas de Jest para sus componentes web Lightning. sa11y es un complemento para escribir pruebas de accesibilidad y asegurarse de que sus componentes sean accesibles.

El punto de entrada para usar las bibliotecas son los scripts definidos en la sección scripts .

Los scripts se pueden ejecutar localmente, bajo demanda y de forma automatizada. Por lo general, estos scripts se ejecutan automáticamente antes de enviar su código a un repositorio de código al fusionar su código con código desarrollado por otros, o al mover cambios entre entornos en su canalización. Esto garantiza que el código tenga la calidad esperada y que su funcionalidad no se rompa. Este concepto se conoce como integración continua, y puede ver un buen video de codeLive al respecto.

El uso de estas bibliotecas no es obligatorio, pero recomendamos encarecidamente hacerlo. Para saber más sobre este tema, lee nuestra entrada de blog .

Otras joyas de las Extensiones de Salesforce para VS Code

Eso no es todo sobre las extensiones de Salesforce. Agregan a VS Code muchas más capacidades, como resaltado de sintaxis, finalización de código y validación de CSS para Lightning Web Components, Aura Components, Apex, SOQL y Visualforce.

También muestran una pestaña de prueba que hace que sea mucho más fácil ejecutar y escribir pruebas de Apex y Lightning Web Components.

Y, por último, también facilitan la depuración de Apex, gracias a Apex Replay Debugger .

Además de eso, algo muy bueno de VS Code es que puede agregar toneladas de extensiones creadas por desarrolladores de todos los diferentes ecosistemas. Hay extensiones para ayudarlo con el control de versiones y con el análisis estático de código (como PMD ). Existen extensiones para Prettier y ESLint que te dan avisos cuando el código no cumple con sus reglas. Hay extensiones para casi todo lo que pueda necesitar, ¡incluso para usar Chat GPT! Eche un vistazo al VS Code Marketplace para ver todas las extensiones disponibles o, mejor aún, ¡cree la suya propia!

Conclusión

¡Vaya, eso fue mucho! En esta publicación de blog, aprendió sobre las herramientas de desarrollador que todo desarrollador de Salesforce debe conocer y utilizar. Al dominar estas herramientas, se convertirá en un desarrollador mucho más productivo, rápido y feliz. Si quieres aprender todo este contenido en formato de video, mira nuestro episodio de codeLive . Si trabaja con sandboxes, puede ampliar su conocimiento sobre cómo trabajar con sandboxes y la CLI de Salesforce leyendo nuestra serie de publicaciones de blog . Y si tiene preguntas, no dude en hacerlas en Salesforce Developers Trailblazer Community . ¡Feliz codificación!

Sobre el Autor

Alba Rivas trabaja como Principal Developer Advocate en Salesforce. Puedes seguirla en Linkedin , Twitter o GitHub .

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

Aspectos destacados de la versión para desarrolladores | Aprende Moar Verano '23 ☁️

Aspectos destacados de la versión para desarrolladores | Aprende Moar Verano '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.

Aspectos destacados de la versión para desarrolladores | Aprende Moar Verano '23 | Blog de desarrolladores de Salesforce

¡Haz un gran revuelo con el lanzamiento de Summer '23!

Sabemos que cada versión trae consigo muchas funciones nuevas y sorprendentes, y puede haber mucho que digerir. Con Learn MOAR, empaquetamos el lanzamiento y se lo ofrecemos en un formato fácil de digerir con blogs, videos y más.

¡Es fácil empezar!

  • ¡Explore los trailmixes de Trailhead con aspectos destacados de lanzamiento clave para desarrolladores o administradores, o ambos!
  • ¡Únase a nosotros para Release Readiness Live ! Los expertos en productos y los defensores de los desarrolladores analizarán y demostrarán las nuevas funciones en el lanzamiento de Summer '23 y, al final de nuestra transmisión, responderemos sus preguntas. Sintonice a las 9 am PT el 19 de mayo para la sesión de desarrolladores. ¿No puedes unirte a nosotros en vivo? La grabación se publicará unas horas después de que finalice la transmisión.

Siga y complete un trailmix de Learn MOAR Summer '23 para administradores o desarrolladores para obtener una insignia exclusiva de la comunidad.

Introducción

¡El lanzamiento de Summer '23 está aquí y está repleto de funciones para desarrolladores! En esta publicación de blog, resumiremos los aspectos más destacados, para que pueda obtener una descripción general de las novedades y decidir qué es lo más interesante para usted. En publicaciones posteriores de Learn MOAR, profundizaremos en algunos de estos aspectos destacados, para que pueda explorarlos con mayor detalle. Mantenerse actualizado con las últimas innovaciones lo ayudará a aumentar su experiencia y convertirse en un desarrollador más exitoso.

Componentes web Lightning

Comencemos hablando de Lightning Web Components, que presentará una gran cantidad de nuevas funciones en Summer '23.

Un par de funciones que estaban en Beta ahora estarán disponibles de forma general (GA). Esto incluye DOM ligero , que permite integraciones de terceros y estilo global, Lightning Web Security para LWC y Aura , que facilita el uso de bibliotecas de JavaScript de terceros en LWC. La API RefreshView , que le permite actualizar la vista de un componente, también será GA. Además, el adaptador de cable GraphQL se está moviendo a Beta, lo que significa que puede probarlo de inmediato, sin tener que registrarse para el programa piloto. Esto cambiará las reglas del juego sobre cómo se leen los datos en Lightning Web Components.

Hay varias mejoras en la sintaxis de LWC que facilitarán la escritura de sus componentes. Se está lanzando una nueva directiva de plantilla lwc:spread (consulte los documentos ), que le permite distribuir propiedades de objetos a un componente secundario, lo que reduce significativamente la cantidad de código que necesita escribir. A partir de Summer '23, podrá establecer un valor dinámico para el atributo de ranura de un elemento HTML. Además, se habilitará la inyección programática de hojas de estilo, lo que le permitirá establecer la propiedad estática de las hojas de estilo para un componente.

¿Ha comenzado a escribir pruebas de extremo a extremo con UTAM? Esta versión también trae mejoras a las capacidades de manejo de errores de UTAM y una extensión de Chrome para identificar objetos de página de UTAM (en Beta).

Móvil sin conexión

Salesforce Mobile App Plus (Salesforce App+) es una versión de la aplicación Salesforce Mobile que habilita LWC Offline. LWC Offline es un entorno de tiempo de ejecución avanzado para componentes web Lightning que aumenta el tiempo de ejecución estándar con funciones diseñadas específicamente para uso móvil y sin conexión. Si bien LWC Offline anteriormente solo estaba disponible en la aplicación móvil Salesforce Field Service, Salesforce App+ le permite usarlo en un contexto más genérico. Salesforce App+ se cerró en Beta en Spring '23 y se trasladará a GA en Summer '23. Salesforce App+ está disponible bajo la licencia Salesforce Mobile Plus.

Integración de plataforma

Tener una plataforma robusta es tan importante como tener capacidades de integración sólidas. Es por eso que la versión Summer '23 trae muchas funciones de integración nuevas.

En esta versión, ampliamos la API REST de Salesforce para admitir la recuperación de elementos secundarios mediante la definición de hasta cinco niveles de consultas SOQL anidadas . También ampliamos la API REST de Connect y la API de Connect (Connect in Apex) para permitir que los desarrolladores creen y administren credenciales con nombre mediante programación. Además, la API GraphQL, que se hizo GA en Spring, ahora admitirá consultas con funciones agregadas y mejorará sus capacidades de manejo de errores . Los eventos de la plataforma también incluyen nuevas funciones, como la capacidad de agregar una clase de devolución de llamada a su código de publicación de Apex , que proporcionará una confirmación cuando el evento de la plataforma se publique correctamente. Además, podrá obtener métricas de uso de eventos de la plataforma consultando el objeto PlatformEventUsageMetric .

También se están mejorando las capacidades de integración en Flow. Flow Builders ahora podrá configurar llamadas HTTP GET a sistemas externos que no tienen una especificación de API abierta a través de la función Servicios externos. Las llamadas HTTP POST están en Beta. Si es un Muley , puede leer más sobre las innovaciones de Flow plus MuleSoft en la siguiente sección.

Además de todo esto, el adaptador GraphQL de Salesforce Connect que anunciamos en febrero se mudará a GA, y Event Relay ahora admitirá Shield Platform Encryption y tendrá una nueva interfaz de usuario de configuración fácil de usar.

Innovaciones entre nubes

Aunque MuleSoft, Tableau y Slack siguen sus propios ciclos de lanzamiento, son partes integrales del ecosistema de Salesforce y de vital importancia para los desarrolladores.

Mula Suave

Una de las innovaciones más recientes de MuleSoft es Anypoint Code Builder (Beta), el IDE de próxima generación de MuleSoft para diseñar, desarrollar e implementar API, integraciones y automatización desde un solo entorno. ¡Compruébalo si aún no lo has hecho!

Si leyó la sección "Integración de la plataforma" anterior, es posible que haya recibido un spoiler: MuleSoft se está integrando en Flow más que nunca. En Summer '23, habrá una nueva sección en la interfaz de usuario de configuración de Salesforce Platform, desde la cual podrá configurar y administrar los servicios de MuleSoft , que luego se pueden usar en Flow Builder. Además, el soporte de MuleSoft se está agregando a Flow Orchestrator , lo que facilita la creación de procesos comerciales automatizados de varios pasos que utilizan los servicios de MuleSoft.

Por último, se lanzará Anypoint Experience Hub . Es la próxima evolución de Anypoint API Community Manager y permite a los clientes crear portales de API en minutos para una mejor participación de API.

Cuadro

Si trabaja con API, es posible que esté familiarizado con la colección Postman de API de Salesforce . Esta colección se ha vuelto muy popular y es ampliamente adoptada en el ecosistema de Salesforce, con actualmente más de 500 bifurcaciones y más de 800 estrellas. Tableau recientemente se subió al carro al agregar sus propias muestras de la API REST de Tableau a la colección. Para obtener más información, lea nuestra entrada de blog .

Si le gustó la colección, le encantará la innovación más reciente de Tableau, cuya vista previa pública se anunció en la Conferencia de Tableau (TC) 2023 del 9 al 11 de mayo. El nuevo Tableau Embedding Playground ofrece a los desarrolladores un entorno de aprendizaje interactivo para desarrollar rápidamente soluciones de análisis integradas. Integre visualizaciones de Tableau y agregue rápidamente interacciones que establezcan filtros y parámetros, obtengan marcas y datos seleccionados, utilizando los componentes básicos de los métodos y las propiedades de la API de incorporación. En el futuro, use sus propias visualizaciones en Tableau Cloud, Tableau Server o Tableau Public para desarrollar sus aplicaciones personalizadas con código que puede exportar y ejecutar en cualquier lugar.

La diversión no se detiene ahí. Para admitir análisis integrados personalizados y seguros, Tableau introdujo recientemente dos nuevas funciones de usuario que permiten a los desarrolladores y administradores pasar cualquier atributo de usuario en tiempo de ejecución dentro del flujo de autenticación integrado. Para obtener más información, leanuestra entrada de blog .

Flojo

Finalmente, nos complace compartir que Slack acaba de anunciar la disponibilidad general de su plataforma Slack de próxima generación. En la nueva plataforma, puede crear aplicaciones modulares mediante el desarrollo de componentes básicos, como funciones, flujos de trabajo y activadores, mediante TypeScript y Deno . Ahora puede implementar en la infraestructura administrada por Slack, ahorrando tiempo y aumentando la eficiencia. En el futuro, los usuarios de Slack podrán aprovechar cada capacidad que ofrece y combinarlas con otras funciones, servicios y proveedores de software para crear automatizaciones potentes y personalizadas. La plataforma también incluye una CLI, que puede usar para desarrollar, probar e implementar sus funciones y flujos de trabajo. Para obtener más información al respecto y obtener experiencia práctica, diríjase a la guía de inicio rápido .

Aprende MOAR

Nuestros gerentes de producto y defensores de desarrolladores están de vuelta para compartir las últimas características y funcionalidades que llegarán en Summer '23. Para ayudarlo a desarrollarse más rápido, hay una gran cantidad de contenido nuevo del equipo de relaciones con desarrolladores que cubre sus nuevas características favoritas. ¡Asegúrese de consultar Release Readiness Live el viernes 19 de mayo a las 9:00 a. m. PST, y lea lo último en el blog de desarrolladores de Salesforce para conocer más innovaciones relacionadas con desarrolladores en el lanzamiento de Summer '23!

Sobre el Autor

Alba Rivas trabaja como Principal Developer Advocate en Salesforce. Actualmente se enfoca en el desarrollo de Lightning Web Components y Slack. Puedes seguirla en Twitter o Linkedin .

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

Agregar a Slack Suscríbete a RSS

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

Eliminación definitiva de registros con Salesforce Flow

Eliminación definitiva de registros con Salesforce Flow

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

Gran idea o pregunta duradera:

  • ¿Cómo eliminar registros de Salesforce utilizando Flow?

Objetivos:

Después de leer este blog, podrá:

  • Comprender la anotación @InvocableMethod
  • Más información sobre el método database.emptyRecycleBin
  • Configurar la acción de Apex para eliminar registros de forma permanente de Flow
  • Configurar el flujo de pantalla con el elemento Eliminar registro
  • Y mucho más

¿Qué es la eliminación completa?

La eliminación definitiva es la eliminación permanente de los registros especificados de la Papelera de reciclaje. Cuando los datos se eliminan de forma permanente, es casi imposible recuperarlos. Esto generalmente se logra a través de los métodos Database.EmptyRecycleBin .

Al vaciar los contenedores de reciclaje, tenga en cuenta las siguientes reglas y pautas:

  • Una vez que los registros se eliminan de la Papelera de reciclaje mediante esta llamada, se pueden consultar mediante queryAll() durante algún tiempo. Por lo general, este tiempo es de 24 horas, pero puede ser más corto o más largo.
  • Una vez que los registros se eliminan mediante la llamada Database.EmptyRecycleBin , no se pueden recuperar.

Warren Mason es administrador de sistemas en Gurukul on Cloud (GoC). En GoC están utilizando Salesforce Flow para optimizar los procesos de ventas. Warren tiene un requisito para eliminar clientes potenciales sin correo electrónico. Está construyendo un flujo de pantalla:

  1. Descubra todos los clientes potenciales sin correo electrónico
  2. Eliminar definitivamente tales clientes potenciales

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

Si bien esto se puede resolver con varias herramientas de automatización como Apex Trigger y otras, usaremos Salesforce Flow y llamaremos a un método de Apex . Para llamar a un método de Apex , agregue el elemento Acción a su Flujo de Salesforce y seleccione una clase de Apex con una anotación @InvocableMethod .

En este artículo, usaremos la llamada clase de base de datos EmptyRecycleBin . Con Database.EmptyRecycleBin es posible borrar los registros de Salesforce. El método EmptyRecycleBin() elimina los registros de la papelera de reciclaje inmediatamente. A partir del lanzamiento de Summer'23 , no es posible acceder directamente al método EmptyRecycleBin desde Flow, por eso estamos usando la clase Apex Invocable.

Antes de discutir la solución, permítame mostrarle un diagrama del proceso a un alto nivel. Dedique unos minutos a revisar el siguiente diagrama de flujo para comprenderlo.

Comencemos a construir este proceso de automatización.

Práctica guiada (nosotros hacemos):

Hay 2 pasos para resolver el requisito comercial de Warren usando Screen Flow . Debemos:

  1. Cree una clase de Apex y una clase de prueba para eliminar registros de forma permanente de la Papelera de reciclaje.
  2. Flujo de fuerza de ventas
    1. Definir propiedades de flujo para el flujo de pantalla
    2. Agregue un elemento Obtener registros para encontrar todos los clientes potenciales sin dirección de correo electrónico
    3. Agregue un elemento de decisión para verificar los clientes potenciales encontrados o no (del paso 2)
    4. Agregue el elemento Eliminar registros para eliminar clientes potenciales
    5. Agregar acción: llame a Empty RecycleBin Invocable Apex Class

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

Ahora, tenemos que comprender una nueva anotación de Apex, es decir, @InvocableMethod . Esta anotación nos permite usar un método de Apex como algo que se puede llamar desde Flow y Apex. Los métodos invocables se llaman con la API REST y se usan para invocar un solo método de Apex. Los métodos invocables tienen valores de entrada y salida dinámicos y admiten llamadas de descripción.

La anotación InvocableVariable identifica una variable de clase utilizada como parámetro de entrada o salida para la acción invocable de un método InvocableMethod. Si crea su propia clase personalizada para usarla como entrada o salida de un método invocable, puede anotar variables de miembros de clase individuales para que estén disponibles para el método.

La anotación de variable invocable admite los modificadores que se muestran en este ejemplo.


@InvocableVariable(label='variableLabel' description='variableDescription' requerido=(verdadero | falso))

La clase EmptyRecycleBin contiene dos variables, una para eliminar un solo registro y otra para manejar la eliminación de varios registros. Siéntase libre de pasar el valor a una o ambas variables según sea necesario. Cree la siguiente clase en su organización.


clase pública EmptyRecycleBin { @InvocableMethod(label='Papelera de reciclaje vacía' description='Eliminar permanentemente los registros de la Papelera de reciclaje.' iconName='slds:estándar:record_delete' categoría = 'Acciones de Apex personalizadas') ejecución de vacío estático público (Lista <Solicitudes> lista de solicitudes) { List<SObject> recordstoDelete = New List<SObject>(); para (Solicitudes req: lista de solicitudes) { if(req.obj != null){ recordstoDelete.add(req.obj); } if(req.listofSObjects != null){ recordstoDelete.addAll(req.listofSObjects); } } if(registrosparaEliminar.tamaño()>0){ Database.emptyRecycleBin(registrosparaEliminar); } } Solicitudes de clases públicas{ @InvocableVariable (descripción ='Aceptar un registro de tipo SObject.' requerido=falso) objeto público SObject; @InvocableVariable (descripción ='Aceptar múltiples registros de un tipo SObject.' requerido=falso) public List<SObject> listofSObjects; }
}

Copie el código de GitHub o instálelo usando esta URL .

Paso 2.1: Definir propiedades de flujo

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

Paso 2.2: Adición de elementos Obtener registros para encontrar clientes potenciales sin correo electrónico

El siguiente paso es usar el objeto Prospecto para encontrar los prospectos sin dirección de correo electrónico.

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Obtener registros .
  2. Introduzca un nombre en el campo Etiqueta ; el nombre de la API se completará automáticamente.
  3. Seleccione el objeto Prospecto de la lista desplegable.
  4. Seleccione Se cumplen todas las condiciones (Y) .
  5. Establecer condiciones de filtro
    1. Fila 1:
      1. Campo : Correo electrónico
      2. Operador : Igual
      3. Valor : {!$ConstanteGlobal.EmptyString}
  6. Cuántos registros almacenar:
    1. Seleccionar todos los registros
  7. Cómo almacenar datos de registro:
    1. Elija la opción para Almacenar automáticamente todos los campos .

Paso 2.3: uso del elemento de decisión para verificar la variable de recopilación de registros (del paso 2)

Ahora usaremos el elemento Decisión para comprobar la Variable de recopilación de registros del paso 2 para saber si devuelve el cliente potencial o no.

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Decisión .
  2. Introduzca un nombre en el campo Etiqueta ; el nombre de la API se completará automáticamente.
  3. En Detalles del resultado , ingrese la etiqueta que el nombre de la API se completará automáticamente.
  4. Requisitos de condición para ejecutar el resultado : se cumplen todas las condiciones (Y)
    1. Fila 1:
      1. Recurso: {!Get_Leads}
      2. Operador: es nulo
      3. Valor: {!$ConstanteGlobal.Falso}
    2. Haga clic en Listo .

Paso 2.4: Agregar acción: eliminar registros para eliminar clientes potenciales

El siguiente paso es eliminar los clientes potenciales que encontramos en el Paso 2.2 . Para ello utilizaremos el elemento Eliminar Registros .

  1. En Flow Designer, debajo del nodo , haga clic en el icono + y seleccione el elemento Eliminar registros .
  2. Introduzca un nombre en el campo Etiqueta ; el nombre de la API se completará automáticamente.
  3. Para Cómo encontrar registros para eliminar, seleccione Usar los ID almacenados en una variable de registro o una variable de colección de registros .
  4. Selecciona el   {!Get_Leads} de la lista desplegable.
  5. Haga clic en Listo.

Paso 2.5: Adición de una acción para llamar a una clase de Apex invocable

  1. En Flow Designer, haga clic en el icono + y seleccione el elemento Acción .
  2. Seleccione la clase de Apex invocable EmptyRecycleBin .
  3. Ingrese un nombre en el campo Etiqueta : el nombre de la API se completará automáticamente.
  4. Establecer valores de entrada:
    1. Objeto para “listofSObjects” (Entrada) : Lead
    2. Objeto para "obj" (Entrada) : Plomo
  5. Almacenar valores de entrada
    1. listofSObjects : {!Get_Leads}
  6. Haga clic en Listo .

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

Una vez que todo se vea bien, guarde el flujo.

Prueba de concepto

  1. Creé 201 clientes potenciales sin una dirección de correo electrónico para probar el flujo anterior.
  2. Ahora ejecute el flujo de pantalla y espere a que se complete el flujo.
  3. Vuelva a la Papelera de reciclaje para asegurarse de que los clientes potenciales se hayan eliminado definitivamente.

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

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

Actualizaciones de integración de plataforma para desarrolladores | Aprende Moar Verano '23 ☁️

Actualizaciones de integración de plataforma para desarrolladores | Aprende Moar Verano '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.

Actualizaciones de integración de plataforma para desarrolladores | Aprende Moar Verano '23 | Blog de desarrolladores de Salesforce

¡Únase a nosotros para Release Readiness Live esta semana! Los expertos en productos y los defensores de los desarrolladores analizarán y demostrarán las nuevas funciones en el lanzamiento de Summer '23 y, al final de nuestra transmisión, responderemos sus preguntas. Sintonice a las 9 am PT el 19 de mayo para la sesión de desarrolladores. ¿No puedes unirte a nosotros en vivo? La grabación se publicará unas horas después de que finalice la transmisión.

Introducción

El verano finalmente está aquí, y para nosotros los desarrolladores, ¡eso significa un nuevo y emocionante lanzamiento! Exploremos las próximas características que trae la versión Summer '23 para los desarrolladores centrados en la integración de plataformas.

Consultas SOQL anidadas en API

A partir de la API de la plataforma de Salesforce v58.0, SOQL ahora admite consultas de relación que atraviesan hasta cinco niveles de registros primarios y secundarios . Anteriormente, solo se admitía un nivel. Esta característica está disponible para objetos estándar y personalizados, y está limitada a consultas realizadas a través de llamadas de consulta REST y SOAP.

Probémoslo probando una relación padre-hijo de cuatro niveles usando la API REST con la siguiente consulta:

La llamada API ahora devuelve los registros anidados solicitados en la siguiente jerarquía: Cuenta (Nivel 1) → Contacto (Nivel 2) → Caso (Nivel 3) → Comentarios del caso (Nivel 4).

Credenciales con nombre en Connect API

Otra característica útil introducida en esta versión es la capacidad de administrar credenciales con nombre tanto desde la API REST de Connect como desde la API de Connect . Ya no necesita interrumpir su configuración para crear credenciales a través de la interfaz de usuario; ahora, se puede hacer programáticamente,

Por ejemplo, puede recuperar la lista de todas las credenciales con nombre existentes realizando la siguiente llamada a la API:

GET /services/data/v58/named-credentials/named-credential-setup

Alternativamente, puede usar Apex con lo siguiente:

También puede crear credenciales con nombre mediante programación con la API y Apex. Este es un ejemplo de cómo hacerlo con Apex:

Consulte nuestra colección Postman para desarrolladores de Salesforce que presenta las nuevas API de Named Credentials y consulte la documentación de la clase NamedCredentials Apex para obtener más información.

Consultas API de GraphQL con funciones agregadas

Nuestra API GraphQL sigue mejorando y, con esta versión, estamos agregando soporte para registros de consulta que usan funciones agregadas con o sin agrupación .

Podrá contar la cantidad de registros que coinciden con ciertos criterios, calcular el ingreso promedio en todas las cuentas o ver la cantidad total de todas las oportunidades.

Se admiten las siguientes funciones agregadas:

  • avg : devuelve el valor promedio de un campo numérico
  • count : devuelve el número de resultados que coinciden con los criterios de consulta
  • countDistinct : devuelve el número de valores de campo distintos y no nulos que coinciden con los criterios de consulta
  • grouping : especifica si se utiliza un campo al componer el grupo; usar con el argumento de consulta groupBy y el tipo ROLLUP o CUBE
  • max – Devuelve el valor máximo de un campo
  • min – Devuelve el valor mínimo de un campo
  • sum : devuelve la suma total de un campo numérico

Echemos un vistazo a una consulta de ejemplo. La siguiente consulta calcula el ingreso anual promedio de todas las cuentas, agrupadas por industria. Tenga en cuenta que estamos usando el campo aggregate en uiapi en lugar de query , lo que nos permite aprovechar las funciones agregadas.

A continuación, una consulta de GraphQL utilizando la función de agregado promedio y la función de agrupación.

También puede realizar consultas tradicionales dentro de la misma solicitud:

Si desea probarlo, puede usar el cliente Altair GraphQL o nuestra colección Postman de desarrolladores de Salesforce .

Adaptador GraphQL de Salesforce Connect

En febrero de 2023, anunciamos la versión piloto de nuestro adaptador GraphQL de Salesforce Connect y ahora nos complace anunciar que estará disponible de forma general en esta versión de verano de 2023.

El nuevo adaptador de Salesforce Connect para GraphQL actúa como un cliente para integrar datos de fuentes externas que exponen sus capacidades a través de GraphQL. Lo hace de una manera de copia cero al hacer llamadas en vivo a los puntos finales de la API cuando una acción del usuario o del sistema requiere registros específicos. Solo los datos necesarios para esa acción en particular se consultan a través de GraphQL y Salesforce Connect no almacena ni almacena en caché los registros devueltos por el servidor. Además, este adaptador incluye extensiones especiales para AWS AppSync y brinda acceso sin inconvenientes a Amazon RDS.

Para aprovechar este nuevo adaptador, simplemente cree una nueva fuente de datos externa y seleccione el tipo GraphQL .

Apex publica devoluciones de llamada en eventos de la plataforma

Con el lanzamiento de Summer '23, ahora puede realizar un seguimiento de la publicación de eventos de la plataforma utilizando Apex Publish Callbacks . Con esta nueva versión, puede obtener el resultado final de una llamada EventBus.publish a través de una devolución de llamada de publicación de Apex que implemente. Esto le da la opción de realizar un seguimiento de los errores o los éxitos para recibir el resultado final de la publicación. En función de ese resultado, puede decidir qué acción tomar, como intentar volver a publicar eventos fallidos, por ejemplo.

Para realizar un seguimiento de un evento fallido publicado, escriba una clase de Apex e implemente la interfaz EventBus.EventPublishFailureCallback . Si la operación asincrónica falla, se invocará el método onFailure . El parámetro result contiene los valores del campo EventUuid para cada evento fallido, pero no incluye los datos del evento en sí.

Para realizar un seguimiento de las publicaciones de eventos exitosas, escriba una clase de Apex e implemente la interfaz EventBus.EventPublishSuccessCallback . Debido a que la mayoría de las llamadas de publicación suelen tener éxito, el procesamiento de publicaciones de eventos exitosas probablemente no sea una preocupación. Observe siempre los límites de rendimiento y del gobernador de Apex cuando procese este tipo de resultado.

Como práctica recomendada, siempre cree eventos usando sObjectType.newSObject , ya que esto incluye un EventUuid que puede usar para rastrear el evento. Al crear eventos con este enfoque, recomendamos no publicar el mismo evento más de una vez para evitar duplicaciones EventUuid .

Métricas mejoradas para eventos de plataforma

Con esta actualización, ahora puede obtener métricas de uso de eventos mejoradas para eventos de plataforma consultando el objeto PlatformEventUsageMetric . Esto le permite agregar datos de uso por nombre de evento y determinar qué evento consume más de sus asignaciones. Además, puede agrupar el uso por cliente para descubrir cuántos clientes se suscribieron a un evento en particular y cómo se distribuye el uso de entrega de eventos entre los clientes. Además, utilice agregaciones granulares de tiempo de períodos diarios, por hora y de 15 minutos para segmentar los datos de uso para obtener información más detallada.

Cuando consulta PlatformEventUsageMetric , puede usar estos nuevos campos: EventName , Client , EventType y UsageType .

La siguiente consulta de ejemplo devuelve el uso de eventos por hora para eventos entregados entre el 1 y el 2 de abril en horario UTC. También agrega los resultados en intervalos de una hora según lo especificado por el campo TimeSegment . Dado que los campos EventName y Client se especifican en la consulta, los resultados se agruparán por evento y cliente.

= 2023-04-01T00:00:00.000Z AND EndDate

Un resultado de muestra de la consulta anterior sería similar al siguiente, incluirá datos de uso para todos los eventos, Order_Event__e y AccountChangeEvent .

Para obtener más información sobre esta función, consulte la documentación .

Acción HTTP en flujo: GET es GA, POST es Beta

HTTP Callout ahora está generalmente disponible para solicitudes GET , lo que le permite traer datos externos a Flow Builder sin ningún código. Usted crea una acción de Llamada HTTP desde dentro de Flow, que puede llamar a cualquier API de servicio basado en la web. Después de agregar los detalles de la API, Flow Builder genera una acción de llamada reutilizable que puede usar para diferentes flujos y en todo Salesforce.

Para ponerlo en uso, desde el elemento Acciones, seleccione Crear llamada HTTP .

Junto con GA, hemos incluido algunos cambios desde la última versión que agilizan el proceso de configuración.

Ahora puede editar una acción de llamada HTTP de forma declarativa. Las API cambian regularmente, por ejemplo, cuando se agrega un nuevo campo obligatorio a un sistema externo. Anteriormente, para editar la acción de llamada HTTP reutilizable, modificó la especificación de API generada automáticamente, lo que requería conocimientos de JSON. Ahora, puede editar la acción con clics en el menú de configuración de Servicios externos.

También se simplificó la configuración de la estructura de datos de la respuesta de la API. Proporciona una respuesta de API de muestra y Flow infiere los tipos de datos y analiza el JSON para que los datos se puedan utilizar en los flujos. Anteriormente, si necesitaba cambiar los tipos de datos inferidos, editaba el propio JSON. Ahora, selecciona los tipos de datos del campo con clics. Ahora también se admiten los tipos de datos de fecha, fecha/hora y booleano.

Como bonificación adicional, obtiene mensajes de error más intuitivos al crear su acción de llamada HTTP para ayudar a resolver el error y evitar problemas en el tiempo de ejecución.

Y si no puede OBTENER suficiente con HTTP Callout, ahora puede usar el método POST (Beta) para enviar datos de Salesforce a un servidor externo en Flow Builder. Por ejemplo, una nueva cuenta en Salesforce activa un flujo que crea una factura en un sistema externo. Seleccione POST (Beta) , ingrese un cuerpo de solicitud JSON de muestra que la API espera al configurar la llamada HTTP, y Flow infiere la estructura de datos externos.

Aprende MOAR

Guau, ¡son bastantes nuevas características de integración de plataforma para probar! Confío en que facilitarán la vida de muchos desarrolladores. ¡Pero hay más por descubrir! Lo invito a explorar nuestras otras publicaciones de blog para conocer las últimas actualizaciones de LWC, Mobile, MuleSoft y Tableau.

Nuestros gerentes de producto y defensores de desarrolladores están de vuelta para compartir las últimas características y funcionalidades que llegarán en Summer '23. Para ayudarlo a desarrollarse más rápido, hay una gran cantidad de contenido nuevo del equipo de relaciones con desarrolladores que cubre sus nuevas funciones favoritas. ¡Asegúrese de consultar Release Readiness Live el viernes 19 de mayo a las 9:00 a. m. PST, y lea lo último en el blog de desarrolladores de Salesforce para conocer más innovaciones relacionadas con desarrolladores en el lanzamiento de Summer '23!

¡Explore los trailmixes de Trailhead con aspectos destacados de lanzamiento clave para desarrolladores o administradores, o ambos! Siga y complete un trailmix de Learn MOAR Summer '23 para administradores o desarrolladores para obtener una insignia exclusiva de la comunidad.

Otras lecturas

Sobre el Autor

Julián Duque es un defensor principal de desarrolladores en Salesforce, donde se enfoca en Node.js, JavaScript y desarrollo backend. Le apasiona la educación y el intercambio de conocimientos y ha estado involucrado en la organización de comunidades tecnológicas y de desarrolladores desde 2001.

Sígalo en Twitter @julian_duque , @julianduque.co en Bluesky o LinkedIn .

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

Agregar a Slack Suscríbete a RSS

Seguir leyendo

Muévete a 2GP Administrado con Migraciones de Paquetes ☁️

Muévete a 2GP Administrado con Migraciones de Paquetes ☁️

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.

Pasar a 2GP administrado con migraciones de paquetes | Blog de desarrolladores de Salesforce

Han pasado casi cuatro años desde que lanzamos por primera vez el paquete administrado de segunda generación (2GP) , que permite a nuestros socios de AppExchange crear y distribuir soluciones utilizando un modelo de desarrollo basado en CLI, basado en fuente y fácil de automatizar.

Desde entonces, recibimos una gran cantidad de excelentes comentarios de nuestra comunidad de desarrolladores, y continuamos innovando en múltiples áreas relacionadas con la experiencia del desarrollador, el rendimiento, la paridad del tipo de metadatos con el paquete administrado de primera generación (1GP), etc. Cada vez que nos reunimos con desarrolladores de ISV, constantemente escuchamos sobre la necesidad de que Salesforce los ayude a ellos y a sus clientes a pasarse al mundo de 2GP.

¡Hoy, tengo algunas noticias emocionantes para compartir con todos ustedes! Estamos abordando la pregunta n.º 1 de nuestros desarrolladores de ISV al presentar una nueva función: Migraciones de paquetes . En pocas palabras, Package Migrations automatiza por completo el proceso de convertir paquetes 1GP a 2GP y migra sin problemas a los clientes con paquetes instalados a 2GP. Si es un socio ISV que crea paquetes administrados, ¡esta publicación de blog es para usted!

Antes de sumergirnos en los detalles de las migraciones de paquetes, echemos un vistazo a algunos beneficios de usar 2GP para el desarrollo de paquetes.

Beneficios de usar 2GP para el desarrollo de paquetes

En el corazón de 2GP se encuentra un modelo de desarrollo basado en fuente, donde un repositorio de código fuente como Git representa la fuente de la verdad para su paquete. Esto es fundamentalmente diferente del mundo de 1GP, donde utiliza una organización de empaquetado para mantener todos los metadatos que desea empaquetar y distribuir a sus clientes.

Este modelo de desarrollo impulsado por la fuente, impulsado por la CLI de Salesforce , puede aumentar drásticamente la productividad y la colaboración de su equipo. Los desarrolladores pueden usar Dev Hub para activar rápidamente organizaciones temporales , crear una función de forma conjunta y comprometerla con el control de código fuente. Cuando esté listo para distribuir una nueva versión de su 2GP, simplemente extraiga la rama correspondiente a una máquina local y use la CLI para crear su nueva versión del paquete.

Es importante destacar que este enfoque basado en CLI también significa que puede integrar fácilmente su proceso de empaque por completo en CI/CD, lo que facilita la automatización completa de su flujo de trabajo. Puede, por ejemplo, ejecutar automáticamente Salesforce Code Analyzer en una base de código y, siempre que no se encuentren problemas, crear una nueva versión del paquete.

En el mundo de 1GP, estabas atrapado usando un espacio de nombres diferente para cada uno de tus paquetes. En 2GP, todos sus paquetes pueden compartir el mismo espacio de nombres, lo que le permite aprovechar un enfoque verdaderamente modular para el desarrollo de paquetes para mantener sus paquetes bien organizados. También es posible declarar explícitamente dependencias entre paquetes , asegurando que todo funcione en conjunto sin problemas.

Con 2GP, también obtiene un control de versiones flexible, lo que le permite abandonar versiones de paquetes que ya no desea utilizar. En su lugar, puede especificar un ancestro de la versión del paquete y crear efectivamente una nueva rama en la que desee continuar con su desarrollo.

Finalmente, apoyar a los clientes nunca ha sido tan fácil con 2GP. En el mundo de 1GP, los parches solo se pueden crear desde una organización de parches. Con el modelo de desarrollo basado en el código fuente de 2GP, puede simplemente crear una versión del paquete de parches directamente desde la CLI y, siempre que el parche cumpla con los requisitos relacionados con los cambios menores y la ascendencia del paquete, se crea y está listo para instalarse en la organización de su cliente.

Dicho todo esto, 2GP puede agregar mucho valor a su proceso de desarrollo. ¡Ahora, averigüemos cómo las Migraciones de paquetes pueden ayudarlo a llegar al mundo de 2GP!

Introducción a las migraciones de paquetes

Package Migrations amplía la funcionalidad de 2GP con comandos CLI adicionales y capacidades adicionales para ayudar a los desarrolladores de ISV a realizar una transición completa al mundo de 2GP. Actualmente se encuentra en Developer Preview y está abierto para que todos los desarrolladores de ISV lo prueben en sus paquetes 1GP existentes. ¡Siga leyendo para saber cómo participar en la versión preliminar para desarrolladores!

Hay dos elementos para las migraciones de paquetes: conversión de paquetes y migración de paquetes.

La conversión de paquetes se inicia a través del nuevo comando sf package convert . Toma una versión específica de su paquete 1GP existente (Acme v1.0 en este ejemplo) y usa algo de magia detrás de escena para convertirlo en una versión de paquete 2GP correspondiente (Acme v1.0.0.1 usando la numeración de versión 2GP).

Una vez que tenga una versión de paquete 2GP convertida, puede migrar clientes a 2GP. Si tiene un suscriptor con Acme v1.0 instalado, iniciaría el proceso tratándolo como una actualización de paquete normal: a través de la CLI con sf package install (ver documentos ), instalación de URL o actualizaciones automáticas.

Mientras intenta instalar su paquete 2GP convertido v1.0.0.1, que coincide con la versión mayor.menor del paquete 1GP instalado en el suscriptor A, ejecutamos una nueva lógica que inicia el proceso de migración del paquete . Sin cambiar ningún metadato en la organización del cliente, y sin requerir la intervención del usuario si usa actualizaciones automáticas, simplemente cambiamos las referencias del paquete para que apunten al nuevo paquete 2GP.

Una vez que un cliente migre a 2GP, cualquier parche o actualización del paquete de este cliente deberá usar 2GP.

Participación en la versión preliminar para desarrolladores de migraciones de paquetes

Para probar las migraciones de paquetes, debe ser un socio ISV con acceso a la comunidad de socios de Salesforce .

En la Comunidad de socios, encontrará un canal exclusivo para esta versión preliminar para desarrolladores. Le recomendamos que se una a este canal y configure las notificaciones para enviar por correo electrónico cada publicación para recibir las últimas actualizaciones del equipo de Migraciones de paquetes.

En este canal, encontrará una serie de enlaces útiles, incluido un formulario para registrarse en Developer Preview. Necesitaremos algunos detalles, como su ID de organización de empaquetado, para que podamos activar la función Migraciones de paquetes.

Es importante destacar que participar en Developer Preview no tendrá ningún impacto en su paquete de 1GP. Por lo tanto, no se preocupe y participe, ya que sus comentarios son esenciales para ayudarnos a identificar y resolver problemas lo antes posible.

Una vez que esté activado, puede comenzar a probar las migraciones de paquetes.

Probar la conversión de un paquete administrado de primera generación

Muy bien, ¡comencemos! En primer lugar, asegúrese de haber instalado la CLI de Salesforce.

Si lo instaló anteriormente, asegúrese de estar usando la última versión:

sf update

Ahora asegúrese de que está ejecutando dentro del contexto de un proyecto de SalesforceDX. Puedes crear un nuevo proyecto usando:

sf project generate --name <Your project name>

Vincule el espacio de nombres de su 1GP administrado iniciando sesión en su DevHub y siga los pasos .

¡Eso es todo para la configuración! Ahora puede continuar e intentar convertir su paquete.

sf package convert --installation-key mdpTest --package 033xxx --wait 20

Repasemos los parámetros. Estamos utilizando la clave de instalación mdpTest . Será necesario cada vez que intente instalar esta versión del paquete en el futuro. Alternativamente, puede usar --installation-key-bypass para omitir la clave de instalación. Deberá ingresar su ID de paquete 1GP completo comenzando con 033 después de --package . El proceso de conversión puede demorar un poco y, por lo tanto, agregamos la opción --wait para esperar 20 minutos.

A medida que se ejecuta el proceso de conversión, obtendrá una actualización de su estado. Suponiendo que todo salió bien, recibirá un mensaje de éxito con la ID y la URL de instalación para la versión del paquete 2GP recién convertida.

Converting Package... ... Successfully created the package version [08cxxx00000KzFSAA0]. Subscriber Package Version Id: 04txxx00000u1cqAAA
Package Installation URL: https://login.salesforce.com/packaging/installPackage.apexp?p0=04txxx00000u1cqAAA
As an alternative, you can use the "sfdx package:install" command.

¡Felicitaciones, su paquete ahora está convertido a 2GP! Si encontró algún problema en el camino, infórmenos utilizando el formulario en el grupo Comunidad de socios .

Nota: Al momento de escribir esta publicación de blog, este comando convertirá la última versión administrada y lanzada de su paquete. Estamos trabajando para permitirle convertir versiones de paquetes Beta y anteriores. Por otro lado, durante Developer Preview, no es posible promocionar paquetes 2GP convertidos al estado Lanzado.

Ahora que su paquete está convertido, probemos la migración de una organización suscriptora.

Probar la migración de un paquete administrado de primera generación instalado

Para probar la migración de un suscriptor, deberá crear una organización borrador ya que, durante la versión preliminar para desarrolladores, solo admitimos organizaciones borrador. Puede configurar una nueva organización borrador como esta:

sf org create scratch -f project-scratch-def.json -a MyScratchOrg

En el código anterior, -f apunta a su archivo de definición de organización borrador . Debe asegurarse de que su archivo de definición de organización borrador incluya cualquier función de Salesforce de la que pueda depender su paquete. Finalmente, estamos usando MyScratchOrg como el alias de esta organización.

Con la configuración de la organización borrador, continúe e instale la versión del paquete 1GP que convirtió anteriormente utilizando la URL de instalación que obtiene de su organización de empaquetado 1GP. Esta debería ser su última versión administrada y lanzada en este momento.

Puede confirmar que el paquete se instaló correctamente durante la pantalla de instalación. Vea el ejemplo a continuación.

Y consulte la sección Paquetes instalados del menú Configuración.

Ahora que instaló su 1GP en la organización borrador, está listo para la migración.

Inicie el proceso de migración utilizando la URL de instalación que recibió al final del proceso de conversión del paquete:

https://login.salesforce.com/packaging/installPackage.apexp?p0=04txxx00000u1cqAAA

Ahora pasará por el mismo conjunto de pantallas que el anterior, pero esta vez para su paquete 2GP convertido.

Actualmente, la interfaz de usuario muestra que la "instalación" se ha completado. En realidad, lo que hicimos fue una migración de paquetes que se completó con éxito.

Tenga en cuenta que en este ejemplo, he usado la segunda compilación Beta para la versión 1.7, que corresponde a la misma versión mayor.menor que la versión del paquete 1GP instalada anteriormente. Como el 2GP convertido, durante la Vista previa del desarrollador, se crea como una versión Beta, se muestra como tal.

Una vez más, puede confirmar la versión del paquete actualizado en la sección Paquetes instalados del menú Configuración, que también muestra, en este ejemplo, que el número de versión es 1.7 (Beta 2).

Una vez que haya migrado el paquete en su organización borrador, le recomendamos que lo pruebe para asegurarse de que funciona como se esperaba.

También debe aprovechar la oportunidad para verificar si las aplicaciones, como la aplicación de administración de licencias o la aplicación de administración de funciones, muestran la información correcta para su paquete migrado. Si encuentra algo que no está bien, por favor plantéelo como un problema y lo investigaremos.

Mientras tanto …

Se necesitarán algunos lanzamientos para que las migraciones de paquetes estén disponibles de forma general. Su participación en Developer Preview, probando sus paquetes y brindándonos comentarios, es esencial para ayudarnos a identificar y resolver problemas antes.

Mientras tanto, ¿qué más puedes hacer? Le recomendamos que experimente con el uso de paquetes de segunda generación como parte de su modelo de desarrollo actual basado en 1GP. ¿Confundido? Dejame explicar.

Como mencioné anteriormente, hay una serie de ventajas específicas de 2GP. De estos, hay algunos de los que puede comenzar a beneficiarse hoy. Estos son los pasos que puede seguir:

  1. Puede configurar su control de código fuente y alimentarlo con metadatos extraídos de su organización de empaquetado.
  2. Puede crear un DevHub y organizaciones borrador derivadas para el desarrollo utilizando metadatos de su control de código fuente.
  3. Puede crear un paquete 2GP para desarrollo interno y pruebas que reflejen su paquete 1GP, pero usando un espacio de nombres solo interno o el mismo que su paquete 1GP. Las colisiones de espacios de nombres evitarán que los paquetes 1GP y 2GP con el mismo espacio de nombres se instalen en el mismo entorno.
  4. Una vez que esté satisfecho con el contenido de su paquete 2GP, puede migrar los metadatos desde la rama de control de fuente correspondiente a su organización de empaquetado y emitir una nueva versión de su paquete para distribuir a los clientes.

Esto lo ayudará a sumergirse en el mundo de 2GP y, una vez que Package Migrations esté disponible de forma general, podrá abandonar su modelo de desarrollo de 1GP por completo y pasar por completo a un modelo de desarrollo de 2GP.

Conclusión

Estamos muy entusiasmados con las migraciones de paquetes, pero necesitamos su ayuda para asegurarnos de que sea lo mejor posible. Si es un desarrollador de ISV, continúe y regístrese para la Vista previa para desarrolladores en la Comunidad de socios.

¡Estamos ansiosos por recibir sus comentarios!

Más recursos

Grupo de vista previa para desarrolladores en la comunidad de socios

Embalaje gestionado de segunda generación (documentación)

Sobre el Autor

John Belo es director de gestión de productos para productos de experiencia de desarrollador y se centra en migraciones de paquetes, analizador de código de Salesforce y análisis de aplicaciones de AppExchange. Ha estado en Salesforce durante más de siete años y pasó la mayor parte de este tiempo en el equipo de AppExchange. Comenzó liderando un equipo de evangelistas técnicos de ISV en EMEA y ahora es parte del equipo de gestión de productos de experiencia de desarrollador, siempre con la intención de ayudar a los ISV a tener el mayor éxito 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

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

Calcule la cobertura general del código en Salesforce

Calcule la cobertura general del código en Salesforce

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

Gran idea o pregunta duradera:

  • ¿Cómo calcular la cobertura general del código en Salesforce?

Objetivos:

Después de leer este blog, podrá:

  • Compilar todas las clases de prueba
  • Calcule la cobertura de código de su organización
  • Use SOQL a través de la API de herramientas para calcular la cobertura del código
  • y mucho más

Isabella Stewart trabaja como administradora de Salesforce en Gurukul On Cloud (GoC). GoC está trabajando con un proveedor externo para implementar Field Service Lightning para mejorar la experiencia del cliente. Isabella recibió una tarea de su gerente para calcular la cobertura de código en PROD.

Práctica guiada (nosotros hacemos):

La cobertura de código es una técnica de prueba que determina qué código se está probando y qué no se está probando. A menudo se representa como un porcentaje de la cantidad de líneas de código probadas para una clase o desencadenador de Apex.

Realice los pasos a continuación para obtener una cobertura de código confiable:

Paso 1: compilar todas las clases de prueba

  1. Vaya a Configuración | Código personalizado | Ejecución de pruebas de Apex .
  2. Desmarque Cobertura de código agregado de solo tienda .
  3. Luego, borre el historial de pruebas navegando a Ver historial de pruebas | Borrar datos de prueba.
  4. El último paso es compilar todas las clases de prueba. Al navegar a Configuración | Código personalizado | Clases de Apex .

Paso 2: verifique la cobertura general del código

Una vez que se completen las pruebas unitarias de Apex, verifique la cobertura general del código para su organización siguiendo las instrucciones a continuación:

  1. Vaya a Configuración | Código personalizado | Clases de Apex .
  2. Haga clic en Estimar la cobertura de código de su organización .

También puede ejecutar la siguiente consulta para averiguar la cobertura de toda la organización. Si consulta desde Developer Console Query Editor, asegúrese de seleccionar Use Tooling API .

ApexOrgWideCoverage representa los resultados de las pruebas de cobertura de código para toda una organización.


SELECCIONE Porcentaje cubierto DESDE ApexOrgWideCoverage

El siguiente ejemplo de consulta SOQL recupera resultados de cobertura de código para una clase o activador específico:


SELECCIONE TestMethodName, NumLinesCovered, NumLinesUncovered FROM ApexCodeCoverage DONDE ApexClassOrTrigger.Name='AccountTrigger'

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

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

Configurar el tamaño de lote para el activador de eventos de plataforma

Configurar el tamaño de lote para el activador de eventos de plataforma

Última actualización el 30 de abril de 2023 por Rakesh Gupta

Gran idea o pregunta duradera:

  • ¿Cómo configurar el usuario y el tamaño del lote para Platform Event Trigger?

Objetivos:

Después de leer este blog, podrá:

  • Comprender el tamaño del lote para el activador de eventos de la plataforma
  • Anular el usuario de ejecución predeterminado para el desencadenador de eventos de la plataforma
  • Cree PlatformEventSubscriberConfig a través de la API REST
  • y mucho más

Jestilla Zetkin trabaja como arquitecta de Salesforce en Gurukul On Cloud (GoC) . Recientemente, enfrentó desafíos mientras trabajaba con eventos de plataforma, principalmente límites de gobernadores. Quiere aprender a configurar el tamaño del lote para el activador de eventos de la plataforma. En este ejercicio, configuraremos el tamaño del lote para lo siguiente:

  1. Activador de vértice
    1. LeadGenerationEventTrigger en Lead_Generation__e
    2. Tamaño del lote: 50
    3. Usuario ejecutor: Usuario de integración

¿Qué es Plataforma de Eventos?

Las arquitecturas basadas en eventos se han vuelto muy populares en los últimos años, y por una buena razón. Se basa en el patrón de fuego y olvido . Activar un evento y dejar que cada sistema maneje la lógica empresarial le permite mantener los sistemas no relacionados desacoplados y puede ayudar a simplificar la arquitectura.

Los eventos de la plataforma le permiten entregar notificaciones de eventos seguras, escalables y personalizables dentro de Salesforce o desde fuentes externas. Las aplicaciones pueden publicar y suscribirse a eventos de plataforma en la plataforma de Salesforce mediante Apex, Flow o en un sistema externo mediante CometD. Si desea obtener más información sobre el evento de plataforma, consulte el módulo de Trailhead .

¿Cuál es el tamaño de lote predeterminado para el desencadenador de eventos de plataforma?

De forma predeterminada, el disparador de eventos de la plataforma se ejecuta como el usuario del sistema de procesos automatizados con un tamaño de lote de 2000 mensajes de eventos. A veces es necesario cambiar el usuario y el tamaño del lote para eludir los límites del gobernador u otros desafíos.

Salesforce le permite anular el usuario de ejecución predeterminado y el tamaño de lote de un desencadenador de Apex de evento de plataforma con PlatformEventSubscriberConfig en la API de herramientas o la API de metadatos para configurar el desencadenador.

Puede especificar cualquier usuario activo en la organización de Salesforce. El activador se ejecuta en un contexto de sistema con privilegios para acceder a todos los registros independientemente de los permisos de nivel de campo y de objeto del usuario. Puede especificar un tamaño de lote personalizado de 1 a 2000. El tamaño del lote es el número máximo de mensajes de eventos que se pueden enviar a un disparador en una ejecución.

Comprender el objeto PlatformEventSubscriberConfig

Hagamos una pausa aquí, familiarícese con el objeto de la API de herramientas PlatformEventUsageMetric en Salesforce. Representa los ajustes de configuración para un disparador de Apex de evento de plataforma, incluido el tamaño del lote y el usuario que ejecuta el disparador.

Nombre del campo
Detalles
Tamaño del lote Un tamaño de lote personalizado, de 1 a 2000, para el desencadenador Apex del evento de plataforma. El tamaño del lote corresponde al número máximo de mensajes de eventos que se pueden enviar a un disparador en una ejecución. El tamaño de lote predeterminado es 2000 para activadores de eventos de plataforma.
Nombre del desarrollador El nombre exclusivo del objeto PlatformEventSubscriberConfig.
etiqueta maestra Etiqueta para PlatformEventSubscriberConfig. En la interfaz de usuario, este campo es Configuración de suscriptor de eventos de plataforma.
PlatformEventConsumerId El ID del desencadenador de Apex del evento de plataforma que se va a configurar.
ID de usuario El ID del usuario con el que se ejecuta el desencadenador de Apex del evento de plataforma. De forma predeterminada, el disparador de eventos de la plataforma se ejecuta como la entidad de proceso automatizado. Establecer el usuario que ejecuta a un usuario específico tiene estos beneficios:

  • Los registros se crean o modifican como este usuario.
  • Los registros con campos OwnerId tienen sus campos OwnerId completados para este usuario cuando se crean o modifican.
  • Este usuario crea los registros de depuración para la ejecución del disparador.
  • Puede enviar un correo electrónico desde el activador, que no es compatible con el usuario de Proceso automatizado predeterminado.

Los componentes PlatformEventSubscriberConfig tienen el sufijo .platformEventSubscriberConfig y se almacenan en la carpeta PlatformEventSubscriberConfigs .

Este componente PlatformEventSubscriberConfig tiene la etiqueta LeadGenerationEventTriggerConfig . Contiene la configuración de un disparador de eventos de plataforma, LeadGenerationTrigger , y especifica el tamaño del lote y el usuario.


<?versión xml="1.0" codificación="UTF-8"?>
<PlatformEventSubscriberConfig xmlns="http://soap.sforce.com/2006/04/metadatos"> <platformEventConsumer>LeadGenerationTrigger</platformEventConsumer> <tamaño del lote>50</tamaño del lote> <masterLabel>LeadGenerationEventTriggerConfig</masterLabel> <usuario>desarrollador@automationchampion.com</usuario> <isProtected>falso</isProtected>
</PlatformEventSubscriberConfig>

Práctica guiada (nosotros hacemos):

Para agregar una configuración, realice una solicitud POST como se menciona a continuación:

  1. Abra Workbench e inicie sesión con su nombre de usuario y contraseña de Trailhead Playground .
  2. Asegúrese de haber seleccionado la opción Producción para el medio ambiente .
  3. Navegue a la pestaña Utilidades y seleccione la opción REST Explorer .
  4. Selecciona las siguientes opciones:
    1. Elija un método HTTP para realizar en el URI del servicio REST API a continuación : POST
    2. URL : /services/data/v58.0/tooling/sobjects/PlatformEventSubscriberConfig
    3. Cuerpo : proporcione los valores en el cuerpo de la solicitud. Esta solicitud de ejemplo configura un activador existente con un tamaño de lote de 50 y especifica el ID de un usuario en ejecución.
      1. {
        "Tamaño del lote": "50",
        “Nombre del desarrollador”:”LeadGenerationEventTriggerConfig”,
        “MasterLabel”:”LeadGenerationEventTriggerConfig”,
        “PlatformEventConsumerId”: “01qB0000000Zcug”,
        “ID de usuario”: “005B00000015gt8”
        }
      2. Dónde:
        1. 01qB0000000Zcug, disparador de Apex en Lead_Generation__e
        2. 005B00000015gt8, es el ID de usuario del usuario de integración
    4. Haga clic en Ejecutar .
  5. Puede consultar y recuperar las configuraciones en su organización con SOQL. Si consulta desde Developer Console Query Editor, asegúrese de seleccionar Use Tooling API . Esta consulta de ejemplo recupera todas las configuraciones establecidas en su organización de Salesforce.

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

Use la API REST de Tableau con Postman para diseñar integraciones ☁️

Use la API REST de Tableau con Postman para diseñar integraciones ☁️

La próxima vez que quiera hacer algo con Tableau, pero no pueda encontrar la manera con la interfaz de usuario, vaya a su confiable Postman Collection y pruebe algunos métodos a través de la API REST de Tableau.

La publicación Usar la API REST de Tableau con Postman para diseñar integraciones apareció primero en el blog de desarrolladores de Salesforce .

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

Buscar el siguiente día hábil a partir de una fecha específica

Buscar el siguiente día hábil a partir de una fecha específica

Última actualización el 7 de abril de 2023 por Rakesh Gupta Gran idea o pregunta duradera: no queremos trabajar los fines de semana o días festivos, ¡todos lo entendemos! Si es así, ¿cree que nuestros clientes o prospectos lo hacen? Si tiene dudas, intente enviar un correo electrónico a

La publicación Buscar el siguiente día hábil a partir de una fecha específica apareció por primera vez en Automation Champion .

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

¡Múltiples acciones programadas dentro de un solo flujo!

¡Múltiples acciones programadas dentro de un solo flujo!

Última actualización el 2 de abril de 2023 por Rakesh Gupta Gran idea o pregunta duradera: ¿Cómo se programan varios correos electrónicos con Salesforce Flow? Objetivos: En este artículo, el lector aprenderá lo siguiente: Cómo usar Salesforce Flow para enviar múltiples alertas por correo electrónico usando rutas programadas y mucho más Negocios

La publicación ¡Múltiples acciones programadas dentro de un solo flujo! apareció por primera vez en Automation Champion .

Seguir leyendo

Uso del flujo de credenciales del cliente para una autenticación API más sencilla ☁️

Uso del flujo de credenciales del cliente para una autenticación API más sencilla ☁️

Las API de Salesforce ahora son compatibles con las credenciales de cliente de OAuth, lo que facilita más que nunca establecer integraciones de servidor a servidor que no necesariamente necesitan el contexto del usuario.

La publicación Uso del flujo de credenciales del cliente para una autenticación API más sencilla 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