• Skip to primary navigation
  • Skip to main content

Jorge Arrambide

Especialista en programación web en java

  • ¿Quién soy?
  • Contactar
  • Servicios
    • Asesorías de programación universidad
  • Articulos
    • Java
    • Salesforce
    • WordPress

Salesforce

¿Cómo o en que lenguaje esta hecho Salesforce?

Como se puede observar en la siguiente imagen, que es un error en tiempo de ejecución, en un ambiente sandbox de Salesforce, el lenguaje de programación base de este CRM es Java.

Además, desde hace unos pocos años, su interfaz visual ahora es generada con el framework aura (que ya paso a ser propiedad de Salesforce y ya no es código abierto).

Salesforce tiene sus cimientos en Java

Cómo ocultar o mostrar el botón nuevo de una lista relacionada en Salesforce

Mostrar/ocultar botón nuevo

Lo primero que tienes que hacer, es ir a Configuración, luego a Gestor de objetos.

Selecciona el objeto que tiene la lista relacionada en la que deseas hacer el cambio.

Luego en “Formatos de página“, selecciona el o los formatos en donde quieres mostrar o ocultar el botón.

Luego te desplazas hasta la parte de Listas relacionadas, dando clic en la figura de herramienta.

Se mostrará un modal con la sección de Botones, en esa sección puedes mostrar o ocultar el botón Nuevo.

Mostrar o ocultar botón Nuevo en una lista relacionada

Cómo consumir WSDL de servicios web personalizados de salesforce

En este breve tutorial, mostraré los pasos necesarios para consumir un web service de una clase personalizada en Salesforce, con la herramiente SOAP UI.

Descargar el WSDL de compañía (enterprise)

Primero descargaremos el wsdl enterprise (recuerda descargar el WSDL del sandbox requerido), buscando en el menú de configuración lo siguiente:

Código personalizado / API, luego ir a la sección WSDL de compañia y guardarlos como entreprise.wsdl (puede ser otro nombre)

A continuación los pasos para importar el archivo enterprise.wsdl en SOAP UI:

1.- Crear un proyecto (New project SOAP) en SOAP UI

Crear proyecto en SOAP UI

2.- Dar clic en Browse

Seleccionamos el WSDL que descargamos de Salesforce

3.- Seleccionar el archivo enterprise.wsdl

Archivo enterprise.wsdl de Salesforce

4.- Nombrar el proyecto en SOAP UI, aquí muestro el prefijo que uso:

Nombramos el proyecto

5.- Así queda la estructura del proyecto del archivo enterprise.wsdl

Estructura del proyecto ENTERPRISE.wsdl creado

6.- El método que nos interesa, es login, lo expandimos (símbolo +) damos doble clic sobre Request1, y proporcionamos el usuario de salesforce que se usará para llamar a los métodos que serán expuestos mediante SOAP.

Es importante colocar en la etiqueta urn:password, la contraseña + token del usuario, todo junto sin espacios.

Importante colocar el password y token

7.- Una vez proporcionado el usuario y la contraseña + token, damos clic en el icono RUN (triangulo verde), y tendremos que ver una respuesta como la siguiente:

Obtenemos el sessionId de Salesforce

La siguiente fase, es descargar el WSDL de nuestra clase que creamos, que contiene los métodos que se van a exponer al cliente, para crear OTRO proyecto SOAP.

1.- Ir a configuración en Salesforce, buscar clases, y descargar el WSDL de la clase que deseamos consumir mediante SOAP, en este caso la clase que creé se llama STA_WS_ExternoToSF

Buscamos nuestra clase que esta declarada para ser consumida con SOAP

2.- Una vez descargado, repetimos el mismo paso, para crear otro proyecto SOAP, cargando el nuevo archivo WSDL y nombramos al proyecto con el nombre que desees. (De preferencia que tenga un sufijo que indique de que SANDBOX fue descargado dicho archivo)

3.- En el nuevo proyecto SOAP, buscamos el método que queremos consumir, en este caso, el método que cree fue upsertCliente (así nombré el método el cual inserta o actualiza) y con el sessionId obtenido en la respuesta del método login, lo colocamos como en la siguiente imagen.

En la etiqueta <sta:xml> colocamos el xml que recibirá el método, importante que este envuelto en <![CDATA[ xxxxx ] ]>

Ejemplo de como consumir un método mediante SOAP de Salesforce

Cómo usar el loading spinner en componentes lightning

Esta es la forma más “elegante” que he encontrado, para mostrar/ocultar el gif del spinner.

Necesitaremos lo siguiente:

  • Handler mediante el evento aura:waiting y aura:doneWaiting
  • Una función en el controller que sea invocada por aura:waiting y otra que sea invocada por aura:doneWaiting
  • Condicional aura:if, para mostrar o ocular el spinner
  • Los tags (div y span) con sus respectivas clases (slds-spinner…) para desplegar el spinner
  • El else (aura:set attribute=”else”), de la condicional de aura:if

En el siguiente ejemplo, al cargar el componente se muestra un botón Guardar, al dar clic en el botón, entra en acción el evento aura:waiting, que manda llamar la función waiting en el controller, con lo cual se muestra el gif del spinner.

Cuando se termina de ejecutar la función funcionGuardar , del evento clic del botón Guardar, entra en acción el evento aura:doneWaiting, para llamar a la función doneWaiting del controller, y cambiar el estatus de la variable HideSpinner.

Una desventaja, es que si tienes una página usas más de 2 componentes y cada componente tiene su propio spinner y sus propios eventos de aura; al activar el evento aura:waiting, el spinner se mostrará en todos los componentes.

Código en el componente:


&lt;aura:handler event="aura:waiting" action="{!c.waiting}"/&gt;
&lt;aura:handler event="aura:doneWaiting" action="{!c.doneWaiting}"/&gt;
&lt;aura:attribute name="HideSpinner" type="Boolean" default="true"/&gt;

&lt;aura:if isTrue="{!v.HideSpinner}"&gt;
	
	&lt;div class="slds-spinner_container" &gt;
		&lt;div class="slds-spinner--brand slds-spinner slds-spinner--large" role="alert"&gt;
			&lt;span class="slds-assistive-text"&gt;Loading, Please Wait...&lt;/span&gt;
			&lt;div class="slds-spinner__dot-a"&gt;&lt;/div&gt;
			&lt;div class="slds-spinner__dot-b"&gt;&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	
	&lt;aura:set attribute="else"&gt;
	  &lt;lightning:button variant="brand" label="Guardar" title="Guardar" onclick="{! c.funcionGuardar }"/&gt;
	&lt;/aura:set&gt;

&lt;/aura:if&gt;

El siguiente código estaría en el controller.js

waiting: function(component, event, helper) {
  component.set("v.HideSpinner", true);
 },
 doneWaiting: function(component, event, helper) {
  component.set("v.HideSpinner", false);
 }

Actualización

Los eventos aura:waiting y aura:doneWaiting, están en desuso según la documentación oficinal de Salesforce, por lo que se recomienda usar otro método.

Cómo mostrar mensajes de éxito o error en Lightning

En Salesforce se les conoce como “User Notifications“, a los cuadros que son usados principalmente para mostrar mensajes de éxito o error al guardar/procesar información.

Diferentes tipos de mensajes
var toastEvent = $A.get("e.force:showToast");
toastEvent.setParams({
    title: "¡Éxito!",
    message: "Contacto guardado éxitosamente.",
    type: "success"
});
toastEvent.fire();

Los types pueden tener los siguientes valores:
success
error
warning
information

Llamar una función desde otra función en el mismo controller

A modo de nota, se puede hacer de dos maneras:

  • Mediante $A.enqueueAction
  • Cambiar la función que se desea invocar en el helper

Mediante $A.enqueueAction

Un ejemplo del código para ilustrar es el siguiente (tomado de stackoveflow):

({
    bar : function(component, event, helper) {
        console.log('Paso 2');
    },
    foo : function(component, event, helper) {

        console.log('Paso 1');

        var a = component.get('c.bar');
        $A.enqueueAction(a);

        console.log('Paso 3');

    }
})

“Funciona” a medias, ya que se ejecuta de manera asíncrona, dando como resultado lo siguiente:

El orden es diferente al esperado

Mediante el archivo helper

Esta es la mejor opción, ya que el comportamiento será el esperado, además si otra función en el controller necesita hacer uso de la función (bar), al estar en el archivo helper, se puede invocar sin mayor problema.

Archivo helper.js:

bar : function(component, event, helper) {
        console.log('Paso 2');
    }

Archivo controller.js:

({
        foo : function(component, event, helper) {

        console.log('Paso 1');

        helper.bar(component, event, helper);

        console.log('Paso 3');

    }
})
Resultado de invocar método desde el archivo helper
  • Page 1
  • Page 2
  • Page 3
  • Page 4
  • Go to Next Page »

Derechos de autor © 2025

  • Política de privacidad
  • Política de cookies
Este sitio web utiliza cookies propias para poder optimizar su visita a la página y cookies de terceros para recoger información sobre sus visitas y el uso de nuestra web. Vd. puede permitir su uso, rechazarlo o cambiar la configuración cuando lo desee. En caso de seguir navegando, se considerará que se acepta el uso. Más información: Política de Cookies