Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .
El enlace a la publicación original, lo encontrarás al final de este artículo.
…
Las listas de selección son una excelente manera de personalizar los objetos de Salesforce, proporcionando una solución reutilizable y fácil de administrar con validación incorporada. Sin embargo, acceder a los valores de la lista de selección de manera programática no es sencillo y es importante comprender las diversas técnicas y trampas involucradas. En esta publicación, discutiremos diferentes métodos para acceder a los valores de la lista de selección en Apex y Lightning Web Components. Cubriremos sus limitaciones y lo dejaremos con las mejores prácticas para seleccionar el enfoque correcto (según su caso de uso).
Usar listas de selección en Apex
Una práctica común para acceder a los valores de la lista de selección desde un disparador o un controlador de servidor es utilizar Apex dinámico. Dynamic Apex no se limita a SOQL dinámico, de hecho, le permite analizar objetos y campos mediante programación con métodos del espacio de nombres Schema . Con esta técnica, puede responder preguntas como: ¿Cuáles son los campos de un objeto? ¿Cuál es el tipo de un campo en particular? O, ¿cuáles son los valores posibles de un campo de lista de selección?
El siguiente ejemplo de código muestra cómo puede recuperar valores de lista de selección para el campo "Industria" del objeto "Cuenta" como una lista de Schema.PicklistEntry utilizando getDescribe()
y getPicklistValues():
// Describe el campo Account.Industry Schema.DescribeFieldResult fieldDescription = Account.Industry.getDescribe (); // Obtener valores de lista de selección de la descripción del campo Entradas de lista = fieldDescription.getPicklistValues (); // Haz algo con las entradas para (Entrada Schema.PicklistEntry: entradas) { / * entry.getValue () entry.getLabel () entry.isActive () entry.isDefaultValue () * / }
Si bien este enfoque es funcional y simple, tiene tres limitaciones importantes:
- Se basa en nombres de campos y objetos codificados de forma rígida.
- Devuelve valores que incluyen valores de lista de selección inactivos.
- No maneja valores para tipos de registros específicos.
Puede abordar fácilmente los dos primeros problemas escribiendo un método auxiliar genérico que funcione con cualquier campo y que solo devuelva las entradas activas de la lista de selección:
// Recupera valores de lista de selección activos para un objeto y campo determinados // Ejemplo: getPicklistValues (Account.Industry) lista estática pública <Schema.PicklistEntry> getPicklistValues ( Campo Schema.sObjectField) { // Obtener todos los valores de la lista de selección Lista <Schema.PicklistEntry> entradas = field.getDescribe (). GetPickListValues (); // Devuelve solo valores de lista de selección activos Lista <Schema.PicklistEntry> activeEntries = nueva Lista <Schema.PicklistEntry> (); para (Entrada Schema.PicklistEntry: entradas) { if (entrada.isActiva ()) { activeEntries.add (entrada); } } return activeEntries; }
El fragmento anterior es una implementación ingenua sin almacenamiento en caché, pero puede ver que las cosas comienzan a ponerse un poco más detalladas.
Otra consideración importante (que a menudo se pasa por alto) al acceder a los valores de las listas de selección es el hecho de que los administradores pueden restringir los valores de las listas de selección para un tipo de registro determinado. El enfoque dinámico de Apex que acabamos de cubrir no es compatible con este escenario. Si necesita trabajar con valores de lista de selección para tipos de registros específicos, deberá realizar una llamada a este punto final de la API de la interfaz de usuario :
/ ui-api / object-info / {objectApiName} / picklist-values / {recordTypeId} / {fieldApiName}
En aras de la brevedad, no mostraremos el código Apex completo en esta publicación, pero puede consultar una implementación en el repositorio de PicklistUtils . Este proyecto proporciona una PicklistUtils
reutilizable con una cobertura completa de código y almacenamiento en caché. PicklistUtils
ayuda a manejar todos los casos de uso de listas de selección con llamadas simples:
// 1. Recuperar valores de lista de selección activos para un objeto sin tipo de registro // ... con referencias a objetos y campos Valores de lista = PicklistUtils.getPicklistValues ( Account.sObjectType, Cuenta.Industria ); // ... o con objeto y campo especificados como cadenas Valores de lista = PicklistUtils.getPicklistValues ( 'Cuenta', 'Industria' ); // 2. Recuperar valores de lista de selección activos para un tipo de registro específico PicklistUtils.PicklistEntries valores = PicklistUtils.getPicklistValues ( 'CustomerRequest__c', // Nombre del objeto '0124H000000cz6R', // ID del tipo de registro 'Priority__c' // Nombre del campo );
Uso de listas de selección en componentes web Lightning
Si está creando un componente web Lightning que se basa en valores de lista de selección, puede llamar a un controlador Apex personalizado para recuperar esos valores con los métodos que acabamos de describir. Pero la buena noticia es que existe una solución más sencilla. Usted puede evitar por completo Apex llamando directamente a la API de interfaz de usuario con el getPicklistValues adaptador de cable desde el lightning/uiObjectInfoApi
módulo.
El getPicklistValues
recupera todos los valores de la lista de selección para un tipo de registro y un nombre de campo determinados. El uso del adaptador es interesante por razones de rendimiento porque se beneficia de la caché de Lightning Data Service. Además, esto también reduce la cantidad de código Apex que debe mantener y probar (sin necesidad de un controlador Apex personalizado).
A continuación, se muestra un ejemplo de cómo puede recuperar todos los valores de la lista de selección para el campo Industria del objeto Cuenta:
importar {LightningElement, wire} desde 'lwc'; importar {getPicklistValues} de 'lightning / uiObjectInfoApi'; importar INDUSTRY_FIELD desde '@ salesforce / schema / Account.Industry'; exportar clase predeterminada El ejemplo extiende LightningElement { @wire (getPicklistValues, { recordTypeId: '012000000000000AAA', // ID de tipo de registro predeterminado fieldApiName: INDUSTRY_FIELD }) getIndustryPicklistValues ({error, data}) { si (datos) { / * Haga algo con data.defaultValue y data.values [] Los valores se representan como objetos como este: { atributos: nulo, etiqueta: "Agricultura", valido para: [], valor: "Agricultura" } * / } más si (error) { // Manejar error } } }
Para obtener un ejemplo completo de cómo usar getPicklistValues
en combinación con otros adaptadores de API de interfaz de usuario, consulte la publicación de blog Recuperación de valores de lista de selección sin usar Apex.
Palabras de cierre
Con esto concluye nuestro recorrido por las diferentes técnicas para acceder a los valores de la lista de selección en Apex y Lightning Web Components. Aquí hay un resumen de las mejores prácticas que cubrimos en esta publicación:
- Utilice Apex dinámico cuando trabaje con registros sin tipo de registro.
- Utilice las llamadas de la API de la interfaz de usuario cuando trabaje con tipos de registros en Apex.
- Utilice el adaptador de cable getPicklistValues de la API de interfaz de usuario cuando trabaje con componentes web Lightning.
- Utilice una clase de utilidad de Apex como PicklistUtils para evitar la duplicación de código.
Sobre el Autor
Philippe Ozil es un promotor principal de desarrolladores en Salesforce, donde se centra en la plataforma Salesforce. Escribe contenido técnico y habla con frecuencia en conferencias. Es un desarrollador de pila completa y disfruta trabajar en proyectos de DevOps, robótica y realidad virtual. Síguelo en Twitter @PhilippeOzil o revisa sus proyectos de GitHub @pozil .
…
Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/05/working-with-picklists-in-apex-and-lightning-web-components.html