Contexto de Ejecución en Salesforce

Estás creando un nuevo trigger con la funcionalidad deseada. Lo has probado en tus scratch orgs, funciona correctamente, tus tests devuelven los resultados esperados.

Realizas el pase a la Sandbox de Integración, y PUF!! tu trigger finaliza con una Excepción de Límites superados. ¿Cómo puede ser?

Uno de tus compañeros, te pregunta: ¿Qué se está ejecutando dentro del Contexto de Ejecución al invocar el Trigger?

Si esta pregunta te suena a chino o no estás seguro de los que es el Contexto de Ejecución, quizás este artículo pueda ayudarte… y que sepas que no es culpa de nadie 😉

Continue reading “Contexto de Ejecución en Salesforce”

El framework de Hari Krishnan: lo bueno hecho mejor (Parte 4)

Como tercera entrada de la serie de Frameworks para la gestión de Triggers, no podía faltar la propuesta de Hari Krishnan. Este framework no es revolucionario, sinó que cómo explica el mismo autor, fue la culminación de evolucionar las ideas de Tony Scott, Dan Appleman, y mejorarlos.

De los 3 analizados, este framework, ofrece una orientación a objetos y uso de los nuevos recursos del lenguaje Apex muy interesantes, y amplia las ideas de los 2 frameworks anteriores para la implementación de las buenas prácticas.

Si participas o prevés estar en proyectos de cierto tamaño, conocer este framework es vital, y sobretodo entender su implementación (si tienes poca experiencia como programador, no desistas, dedicando algo de tiempo, no tendrás problema).

Mi intención nuevamente es explicarlo de forma sencilla, a ver si lo consigo.
Continue reading “El framework de Hari Krishnan: lo bueno hecho mejor (Parte 4)”

El framework de Appleman que los inició a todos (Parte 3)

Las ideas propuestas por Dan Appleman en su libro Advanced Apex para la gestión eficiente de triggers, son de las más usadas y se usan como base para otros frameworks aparecidos posteriormente.

De hecho, el título que el autor dio al capítulo de su libro, “One trigger to rule them all” es conocido y mencionado en muchos artículos y sitios web.

Mi objetivo en esta entrada, es explicar de manera llana, los conceptos e ideas de este framework, esencial para cualquier proyecto mediano-grande. Al finalizar el artíuclo, podrás usar el framework directamente mejorar tu actual gestión de triggers.

Continue reading “El framework de Appleman que los inició a todos (Parte 3)”

Un patrón de triggers simple y potente (Parte 2)

Uno de los primeros patrones/frameworks que aparecieron fue en un Force.com Cookbook, y después mejorado en su propio blog, por Tony Scott.

Los principios de este patrón de gestión de triggers son:

  • El trigger no contine código, solo invoca a una clase Handler que implementa la lógica en cada evento
  • Una clase Factory, construye los Handlers de forma dinámica y enruta las acciones en función del evento del trigger (before, insert…)
  • Este funcionamiento requiere de la creación de una Interface que todos los triggers deberán implementar
  • Se incorporan funciones de BULK para eficientar el código

Algunas de las decisiones de este esquema planteado, se repite en varios de los frameworks que iremos viendo, por lo que es muy útil entenderlas.

Continue reading “Un patrón de triggers simple y potente (Parte 2)”

Trigger Frameworks – Triggers súper vitaminados (Parte 1)

Los triggers, son una funcionalidad ampliamente utilizada, pero que a medida que avanza el proyecto y se afianza, su uso desordenado provoca situaciones inadvertidas o efectos laterales indeseados, con frustración por parte del desarrollador y del usuario.

En este artículo quiero explicar, cuales son los problemas habituales, cuando surgen, y como se han desarrollado best practices y frameworks completos, que aportan soluciones, que con poco  esfuerzo permiten evitar estos situaciones complejas de diagnosticar.

Veamos pues, como crear Triggers vitaminados y super-mineralizados.

Continue reading “Trigger Frameworks – Triggers súper vitaminados (Parte 1)”

Salesforce Connect en dreamOlé 18 –

Durante el pasado Abril, tuve el inmenso placer de introducir el protocolo oData mediante el uso Salesforce Connect en dreamOlé.

Este evento, el mayor realizado en España, está liderado por un equipo de personas absolutamente increíble, que dedican su tiempo libre, sus energías y buen humor para crear un evento de ámbito internacional.

Continue reading “Salesforce Connect en dreamOlé 18 –”

Dynamic Planning for Async Processing

As explained in the last 2 entries, asynchronous processing and execution planning capabilities on Salesforce are very useful and powerful.

But nonetheless, in some complex scenarios, you will find some limitations that can be overcome easily.

Let me explain how, with some Apex Developing and using standard capabilities, you can get a quite powerful Dynamic Planner to sort out those limitations.

My goal on this entry is to describe the current limitations on the platform, explain how they can be solved, and hope they are useful and make some contribution to improve your knowledge in this key area.

Continue reading “Dynamic Planning for Async Processing”

Apex Connector Framework – Usar un servicio externo como un Objeto Nativo

Vimos en las entradas anteriores sobre el uso de oData en Salesforce con Connect, pero dejé para más adelante el Apex Connector Framework (ACF), y ha llegado la hora.

Con un caso de uso que espero entretenido e interesante, muestro como el ACF nos abre un fácil integración con sistemas externos que sin él tendría un coste muy elevado, abriendo las capacidades internas de Salesforce Connect.

Si no conoces el ACF, no te preocupes, realizaré una pequeña introducción, y si lo conoces, quizás te intereses saber algo más de criptomonedas 😉

Continue reading “Apex Connector Framework – Usar un servicio externo como un Objeto Nativo”

Planificador Dinámico para Procesos Asíncronos

Como hemos visto en las 2 entradas anteriores, las capacidades asíncronas de Salesforce y su planificación son de gran ayuda.

Aún así, vimos que podemos encontrar una carencia: si nuestros procesos asíncronos tiene ncondiciones funcionales o técnicas de las que depende lanzar su ejecución.

Mi objetivo es explicar la idea, ofreciendo una prueba de concepto funcional, para que puedas darle la vuelta, mejorarlo y ampliarlo para tus necesidades.
Continue reading “Planificador Dinámico para Procesos Asíncronos”

Casos de uso para Apex asíncrono

Partiendo del artículo anterior donde vimos como Salesforce gestiona la ejecución de los procesos asíncronos  veamos como seleccionar el/los método/s  más adecuado/s en casos de uso reales.

Recordemos las posibilidades que tenemos:

  1. Utilización de la anotación @Future
  2. Implementación de la interfaz Schedulable
  3. Implementación de la interfaz Queueable
  4. Implementación de la interfaz Batchable

Continue reading “Casos de uso para Apex asíncrono”

Empezando Apex Asíncrono por las colas

En esta entrada me centraré, en cómo diseñar la ejecución de Procesos Asíncronos Apex (en adelante Apex Async), aprovechando las capacidades de la plataforma.

Pero lo haré de manera invertida a como se hace habitualmente, donde se explica como programar los mecanismos de programación. Pero en IMMO, si los desarrolladores, arquitectos y administradores, entendemos bien como gestiona Salesforce los procesos asíncronos, sus colas de Espera y Ejecución, sus límites asociados, etc., la elección del mecanismo de programación, es muy sencilla u obvia.

Continue reading “Empezando Apex Asíncrono por las colas”

Introducción a la Arquitectura de Eventos en Salesforce

“Four years from now, ‘mere mortals’ Will begin to adopt an event-driven architecture (EDA) for the sort of complex event processing that has been attempted only by software gurus [until now]’
—Roy Schulte (Gartner), 2003

En esta primera entrada de una serie, intento situar, cuales son los mecanismos existentes en Salesforce, cuyo core es el uso de Eventos, e intento compararlos y ubicarlos en sus casos de uso.

Podría decirse que esta es una entrada 101 en Eventos de Salesforce.

En mi experiencia, no es trivial entender los “productos/mecanismos” que ofrece y ofrecerá Salesforce sobre eventos (Streaming API, Platform Events, etc.), y las tecnologías (Kafka, Bayeaux, Long Polling, etc.)  asociadas y los casos de uso a que dan respuesta.

Por ejemplo, el título de esta entrada es incorrecto, ya que debería ser algo así como: Introducción a los mecanismos de la Salesforce Enterprise Messaging Platform (pero con ese nombre …), espero pues, que el resto del artículo no sea como el título ;-).

Continue reading “Introducción a la Arquitectura de Eventos en Salesforce”

BULK API v2: 2 veces más rápida con la mitad de código

Una de las novedades que quizás pasaron inadvertidas en la última release de Winter ’18, fue la nueva versión de la BULK API, denominada BULK API v2, disponible en v41.0.

Esta nueva versión, sigue siendo una API REST, que utiliza los verbos HTTP para crear Jobs, cerrar/abortar, eliminar y obtener información al respecto, aportando novedades para el programador y una mejora del rendimiento para el usuario final.

En esta entrada, se muestran las diferencias entre ambas versiones y se compara el rendimiento.

Continue reading “BULK API v2: 2 veces más rápida con la mitad de código”

Backup en Salesforce: Opciones disponibles y Alternativas

58% of downtime incidents are caused by human error alone (Boston Computing Network)

Every Minute 3,535 data Records are lost (breachlevelindex)

En este artículo, se enumeran los mecanismos nativos en Salesforce para la realización del Backup de datos, y su recuperación. También se analizan los puntos débiles de estas mecanismos ante los casos de uso más habituales de pérdida de datos.

Continue reading “Backup en Salesforce: Opciones disponibles y Alternativas”

Las Named Credentials simplifican el código Apex de Callouts mediante configuración estándar

La mayoría de los proyectos de Salesforce requieren Callouts para integrarse e invocar servicios en sistemas externos. Habitualmente estos Callouts, requieren de código Apex, el cual, puede volverse costoso, voluminoso y engorroso de mantener si desconocemos las Named Credentials.

Continue reading “Las Named Credentials simplifican el código Apex de Callouts mediante configuración estándar”

Replicar cambios en Salesforce hacia sistemas externos – Opciones y alternativas

No creo que sea casualidad que, en cada nueva versión, Salesforce introduzca mejoras sustanciales, a la permeabilización de sus datos y en especial, intentar hacerlo de forma eficiente, estándar y cada vez más simple.

Hasta hace relativamente pocos años, la integración entre Salesforce y sistemas externos, estaba limitada a unos escenarios concretos y a unas APIs reducidas.

Continue reading “Replicar cambios en Salesforce hacia sistemas externos – Opciones y alternativas”

Big Objects: Contenedores de Datos – un quiero y quizás puedo de almacenamiento masivo en Salesforce

En la entrada anterior, describía el caso de uso de cómo acceder a una gran volumen de datos desde nuestra ORG via External Objects, y dejaba la puerta abierta a la alternativa a la funcionalidad nativa de Big Objects en Salesforce.

Esta entrada describe qué son, en qué casos de uso pueden aplicarse, cómo crearlos, insertar datos (con Data Loader que parece ser un caso poco documentado) y describir sus características y restricciones, que no son pocas.

Continue reading “Big Objects: Contenedores de Datos – un quiero y quizás puedo de almacenamiento masivo en Salesforce”

Reporting sobre una Arquitectura Híbrida: Amazon-Salesforce usando Salesforce Connect

Una de las limitaciones que existian en referencia al uso de External Objects, era su limitada capacidad de Reporting.

En un artículo de Mark Kovacevich, Salesforce Connect Reporting, explicaba un workaround mediante programación en APEX:

  • Mostrando una List View con un Controller básico
  • VisualForce que con un Custom Controller muestra los registros y pinta un par de diagramas.

Continue reading “Reporting sobre una Arquitectura Híbrida: Amazon-Salesforce usando Salesforce Connect”

Salesforce Connect para acceder a datos en Amazon RDS via oData

Supongamos el siguiente caso de uso:

  • Queremos acceder a una gran cantidad de datos, que están fuera de nuestra ORG de Salesforce (presumiblemente en una base de datos en nuestro CPD)
  • Queremos acceder a estos datos, sin interfaces ni APIs
  • Queremos realizar reporting y análisis, cruzando esta base de datos con nuestros objetos declarados en nuestra ORG

Continue reading “Salesforce Connect para acceder a datos en Amazon RDS via oData”

Integración Continua en Salesforce (5): Conclusiones Finales

Partimos inicialmente con el deseo y con la convicción de que la Integración Contínua en Salesforce es completamente necesaria, y esa convicción, a pesar de los retos y condicionantes observados,  sigue intacta.

Lo que ha cambiado completamente, es la simplificación con la que se habla y se predica la adopción de este proceso en modo DIY (Do it Yourself).

Continue reading “Integración Continua en Salesforce (5): Conclusiones Finales”

Integración Continua en Salesforce (3): proceso y uso de la herramienta de despliegue

El proceso

Despliegue por diferencias

El proceso de despliegue en Salesforce, a diferencia de, por ejemplo, en el mundo Java, no se realiza desplegando un fichero .ear/.war que contiene todos los componentes y sustituye de forma completa al anterior , sinó que se realiza mediante el despliegue de los componentes añadidos/modificados y listando aquellos que queremos eliminar, lo que se suele llamar incremental, por diferencias (en adelante usaré este último término).

Continue reading “Integración Continua en Salesforce (3): proceso y uso de la herramienta de despliegue”

Una posible adopción de gitFlow en proyectos Salesforce

Vincent Driessen en su blog GitFlow- A successfull Branching Model, describe el casi proceso de facto que aplican muchos equipos de desarrollo para la gestión de ramas (aunque prefiero la explicación y gráficos de AtlassiangitFlow Workflow.)-.

En esta entrada, intento explicar por qué, al menos en mi caso, no es directa su aplicación en un proyecto de Salesforce y las consideraciones adicionales y conclusiones a las que he llegado.

Continue reading “Una posible adopción de gitFlow en proyectos Salesforce”

Skinny Tables para la mejora de rendimiento Salesforce

Supongamos que después de haber seguido las buenas prácticas de diseño, programación, aplicado índices donde era necesario, seguimos teniendo problemas de rendimiento de un Report/Dashboard o SOQL concreta.

Como almacena Salesforce la información internamente

Continue reading “Skinny Tables para la mejora de rendimiento Salesforce”

Mi lista de Limitaciones en Integraciones de Salesforce

Creo que todos lo hemos sufrido -> “Salesforce no soporta FTP nativo” -> Mala cara.

Integración de Salesforce

De mi background como arquitecto de Integración esa afirmación sorprende, pero cuando conoces las capacidades de Integración de Salesforce y otros aspectos como su Seguridad, Fiabilidad, Documentación, Comunidad, etc., se te pasa el susto.

Mantengo una lista de las limitaciones (no en el aspecto negativo) que comparto por si pueden ser de ayuda a alguien y ahorrar algo de tiempo. Por favor, si hay alguna incorrecta (lo siento de antemano) o me faltara alguna, pido por favor mencionarlo, para tener una lista mejor.

  1. Salesforce no tiene un BUS de Integración propio (aunque con Platform Events, Lightning Connect, Streaming API, etc., se da respuesta a muchos casos de uso)
  2. Salesforce no soporta transacciones ACID
  3. Salesforce no soporta WS-Security (https://en.wikipe
  4. dia.org/wiki/WS-Security)
  5. Salesforce no implementa WS-ReliableMessaging (https://en.wikipedia.org/wiki/WS-ReliableMessaging) – que utilizando Outboung Messaging queda mitigado por la lógica de los reintentos cada 10” durante 24h
  6. Salesforce no soporta WS-Addressing, lo que complica el enrutamiento dinámico, en un escenario de Orquestacion empresarial con BUS de Integración disponible
  7. Con Outbound Messaging, no podemos invocar servicios REST (pero hy abierta Idea 08730000000DhyEAAS)
  8. Con Outbound Messaging si al cabo de 10” no hay respuesta se reenvia la petición (hay que certificar Idempotencia en el diálogo)
  9. Con Outbound Messaging solo es posible enviar datos de un objeto, aunque puede recibirse del objeto y de sus objetos relacionados
  10. Las Workflow Rules no son aplicables el borrado de un registro, por lo tanto, no podemos invocar a un servicio externo directamente (existe Workaround mediante trigger)
  11.  Entornos con grandes volúmenes de datos, típicos de un Patrón de Batch, que requieran el uso de BULK API tanto en modo Serial como Parallel, con o sin Chunking, son difíciles de abordar sin herramientas ETL de terceros (que habitualmente tienen un CTO elevado). Nosotros utilizamos Informatica Cloud, aunque ODI y estoy seguro que otras facilitan el uso de BULK API.
  12. Los certificados para comunicación segura con Salesforce deben renovarse anualmente (un poco tedioso para los compañeros de sistemas)
  13. No hay una versión oficial de Data Loader para Linux (es una herramienta de escritorio para Windows y Mac, pero la posibilidad de usarlo como carga masiva usando la BULK API en servidores empresariales Linux es siempre muy tentador y podría…)
  14. Salesforce no proporciona una herramienta de escritorio de ETL simple para que el equipo de negocio pueda cargar datos transformándolos mínimamente (Mass Loader/Update y herramientas como Jitterbit y Dataloader.io, pueden suplir en parte esta carencia)
  15. El Force.com Excel Connector dejó de soportarse hace mucho tiempo, y muchos usuarios preguntan por funcionalidad similar

No menciono los Governor Limits, pq creo que son protecciones necesarias en un entorno Multi-tenant, y en muchos casos, romperlos implica que la solución adoptada no es la adecuada.

Seguramente tenemos otras de muy bajo nivel técnico, pero mi intención es solo compartir mi lista y si es posible mejorarla.

*Si perteneces a Salesforce y lees este artículo, no fruncir el ceño por favor, no hay mejor elogio para un fabricante, que sus clientes utilicen sus herramietnas y la conozcan bien.

Crédito de la imagen para: elearningindustry.com

Data Loader en CLI en Linux/Unix/Mac OS

Data Loader es una herramienta creada en Java, con su código disponible en gitHub, lo que nos permite descargar su código, y montar sus artefactos mediante maven.

 

Todos conocemos la interfaz gráfica, pero como se explica en la documentación del mismo Repositorio de gitHub, también ofrece una clase (com.salesforce.dataloader.process.ProcessRunner) para la invocación por línea de comandos  (CLI – Command Line Interface) en cualquier sistema operativo que disponga de una máquina virtual Java instalada.

Esto permite, por ejemplo, planificar (mediante CRON) cargas/descargas desde servidores empresariales Linux/Unix, y haciendo uso de Bulk API (hay otros muchos casos de uso ).

Utilizar Data Loader via CLI es muy senzillo y se describe en la documentación de Salesforce. Resumiendo son 3 pasos:

  1. Generar nuestro password encritpado en 2 pasos
  2. Crear el mapeo de los campos entre el fichero que cargaremos y el objeto destino
  3. Crear el fichero process-conf.xml q contiene el detalle del proceso a ejecutar (Operación, uso de BULK API, etc.)

Pero si además, estos 3 pasos nos parecen complejos/tediosos existe una herramienta llamada CLIq, que nos automatiza esta generació. Esta herramienta también está disponible en gitHub.

En la imagen adjunto, se observa la ejecución que realizo en el Linux más raro que he tenido nunca, Bash de Ubuntu en Windows, gracias al Windows Linux Subsystem, lo que demuestra que mientras haya disponible una máquina virtual de Java instalada, podemos ejecutar Data Loader y conseguir una nueva herramienta en nuestro arsenal de Integración.

Ejecución de Data Loader en Bash Ubuntu Windows Linux Subsystem
Ejecución de Data Loader en Bash Ubuntu Windows Linux Subsystem

Documentación para profundizar:

Replication API para identificar cambios

La Replication API de Salesforce tiene como objetivo, identificar todos los objetos modificados duante un intervalo de tiempo.

Esta API SOAP, permite obtener en un interval de tiempo, aquellos objetos nuevos, modificados o eliminados en nuestra ORG.

Aunque también esto es posible accediendo a los campos Audit de los registros de los objetos, esta API tiene una característica muy importante: es accesible via 2 métodos de la clase Database: getUpdated(), getDeleted() y es transversal a todos ellos.

En concreto se obtiene, un array de IDs de los registros  nuevos/modificados o eliminados, y la hora en la que se ha realizado la consulta (para poder encadenar posteriormente otra).

Esta API, y supongo de ahí el nombre que le puso Salesforce (y que en mi opinión no es del identificador de su funcionalidad), está dirigida a la Integración de sistemas (obtener los cambios realizados para sincronizar con otro sistemas). Pero existen otros escenarios donde puede ser útil: la  auditoría de cambios durante un evento especial, reconciliación datos etc.

Ejemplo básico de utilización:

Captura de pantalla de uso de la Replication API de Salesforce
Captura de pantalla de uso de la Replication API de Salesforce

Enlaces para saber más: