viernes, 4 de abril de 2014

Ejecutar procesos periodicamente o con fecha predeterminada con Scheduler

Cierto procesos requieren de una ejecución periódica, cálculos internos, etc. Procesos automáticos que se ejecutan a la hora/día determinado.

Para llevar esto acabo utilizaremos la clase Scheduler.

La ejecución se realizará en la fecha indicada, pero como sucede con la clase Batch esta sera añadida a la cola de procesos a resolverse, con lo que puede que no se ejecute al instante.

Clase Scheduler con su correspondiente interfaz Schedulable:
global class scheduledDaily implements Schedulable {
   global void execute(SchedulableContext SC) {
      //Llamada o ejecución del código...
   }
}

Realizamos la llamada, indicando el nombre del proceso, la fecha y la clase schedule:
public static String cron_date = '0 30 12 * * ?'; //Ejecución diaria 12:30
scheduledDaily sd = new scheduledDaily();
System.schedule('Proceso diario', cron_date, sd );

Podemos ver el proceso en ejecución en Setup>Jobs>Scheluded Jobs

Los siete campos a definir en cron_date:
  • Segundos [0-59]
  • Minutos [0-59]
  • Horas [0-23]
  • Dia [1-31]
  • Mes [1-12 or JAN-DEC]
  • Dia de la semana [1-7 or SUN-SAT]
  • Año [1970-2099]

Advertencia:
  • Solo pueden estar en ejecución 100 procesos de este tipo.
  • No se puede utilizar getContent o getContentAsPDFPageReference

Salesforce Oficial:  Scheduler

Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestrweb o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.


viernes, 21 de marzo de 2014

Crear y utilizar un proceso Batch

Salesforce tiene una serie de limites que no se pueden exceder, esto resulta ser un problema cuando insertamos o modificamos grandes cantidades de datos desde una apex.

La solución es implementar un proceso Batch, este realiza las tareas que le indiquemos repartiéndolas en varias transacciones, por lo que reducimos la probabilidades de superar los limites.

Hay que tener en cuenta que este proceso no se ejecuta al instante, sino que se añade a la cola de procesos a ejecutarse, por lo que no podemos saber cuando se ejecutará, esto limita su utilidad práctica.

Para utilizar el Batch, implementaremos la interfaz Database.Batchable, con sus correspondientes métodos.
 global class Batch_DupVacancy implements Database.Batchable<sObject>{
     global final String query;
     global Batch_DupVacancy(String q){
        query = q;
     }
     global Database.querylocator start(Database.BatchableContext i){
           return Database.getQueryLocator(query);
     }

     global void execute(Database.BatchableContext i, List<sObject> scope){
           List<Vacancy__c> lstVac = (List<Vacancy__c>)scope;
           for (Vacancy__c vac :  lstVac) {
                //...
           update lvac; 
     }

     global void finish(Database.BatchableContext i){}

 }

Hacemos la llamada al Batch:
     String query = ' select id, Closing_day__c from Vacancy__c ';
     Batch_DupVacancy batchDV = new Batch_DupVacancy(query);
     Database.executeBatch(batchDV); 

En la anterior llamada por defecto se ejecutan las transacciones en paquetes de 200, pero dependiendo de los procesos que estemos ejecutando en el Batch, nos puede interesar que se ejecuten menos paquetes por transacción, por ejemplo para no superar limites, etc:
     Database.executeBatch(batchDV, 1); 

Advertencia:
  • Solo se pueden tener 5 procesos de este tipo en cola 


Salesforce Oficial:  Batch  -  Limits

Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestra web o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.

viernes, 14 de marzo de 2014

Modificar formato fecha y número en Visualforce con OutputText

Como transformar una fecha o número al formato que nos interesa sin necesidad de tocar la apex, directamente en la Visualforce.

Formato fecha:
 <apex:outputText value="{0,date,yyyy'/'MM'/'dd HH':'mm}">
 <apex:param value="{!opp.Fecha__c}"/>
 </apex:outputText>

Formato número:
 <apex:outputText value="{0,number,###.###,00}">
 <apex:param value="{!opp.Precio__c}"/>
 </apex:outputText>
Si el patrón es con "0", cuando no haya dato mostrará 0.
Si el patrón es con "#", cuando no haya dato no mostrará nada (guardando la coherencia, no lo muestra si esta a la izquierda o detrás de la coma)

Podéis variar los patrones hasta obtener la fecha/cantidad que os interese.

Salesforce Oficial: <apex:outputtext>

Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestrweb o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.

jueves, 5 de diciembre de 2013

Salesforce - Debug Webservices

Hola,

supongo que todos los que habeis intentado acceder a webservices externos desde salesforce, os habeis encontrado en que no sabéis lo que realmente estáis enviando, el xml que se genra y se envía. Pues bien, hay una manera de hacerlo.

En la página http://requestb.in/, tenéis que crear un nuevo request, y entonces la web os da una URL. Cogéis esa URL, y la ponéis como end point de la llamada del vestro código en salesforce, y lanzáis la ejecución de esa llamada.
Una vez que hayáis comprobado que se ha realizado la llamada, volveis a la página del request bin, y la refrescais, y os saldrá el XML que ha generado salesforce y que es lo que está enviando al webservice.

Saludos
Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestrweb o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.

jueves, 29 de agosto de 2013

Usar imágenes en campos fórmula

Es fácil poder usar imagenes en campos tipos formula de Salesforce, y así hacer los formularios mucho más visuales. Para ello se ha de hacer lo siguiente:
  1. Crear un campo fórmula, que de un resultado tipo texto
  2. Usar la funcion IMAGE en el campo fórmula, indicando donde tenemos la imagen
     IMAGE("/img/samples/flag_red.gif", 'ALERT') 
Este caso solo nos sirve para mostra una imagen estática, pero eso no tiene demasiada utilidad. Lo ideal es hacerlo condicional, ya sea utilizando IF o CASE, por ejemplo

 IF( DV_CPM_below_minimum__c , IMAGE("/img/samples/flag_red.gif", 'ALERT'), IMAGE("/img/samples/flag_green.gif", 'OK'))  

en estos ejemplos hemos utilizado imagenes disponibles en salesforce como ejemplos, pero podemos utlizar imágenes propias que hayamos subido como recurso estático. Para ellos hemos de seguir estos pasos:
  1. Subir la imagen como recurso estático en nuestra organizacion
  2. Obtener el enlace del recurso estático
  3. Este nos dará un enlace del tipo "https://cs17.salesforce.com/resource/1374248036000/copy". Para usarlo en la fórmula hemos de dejarlo de la siguiente manera "/resource/copy"
  4. Crear el campo fórmula, con las imágenes que hayamos subido, y nos quedará algo del estilo
     IF( CONDITION , IMAGE("/resource/copy", 'COPY'), IMAGE("/resource/delete", 'DELETE'))  
    
Saludos


    Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestrweb o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.

    SOQL - Como hacer un Select de todos los campos de un objeto

    Hola, 

    Seguro que todos en algún momento habéis necesitado hacer un "select *", pero como sabeis, en SOQL no es posible hacerlo directamente.


    Lo que si es posible es recorrer el esquema del objeto, y montar así una consulta agragando todos los campos. aqui teneis el código de ejemplo:




    1:   Map<String, Schema.SObjectField> mapFields = OBJETO.getSObjectType().getDescribe().fields.getMap();  
    2:      String consulta = 'select ';  
    3:      for (String fieldName: mapFields.keyset()){  
    4:        consulta = consulta + fieldName + ',';  
    5:      }  
    6:      consulta = consulta .substring(0, consulta .length()-1);  
    7:      consulta = consulta + ' from OBJETO where id = \'' + id + '\'';  
    8:      List<OBJETO> obj = Database.query(consulta);  
    



    Saludos

    Este post pertenece a KaizenStep, el partner preferente de Salesforce en Barcelona. Puedes encontrar información de nuestros servicios en nuestrweb o si quieres leer posts de funcionalidades y negocio, puedes consultar nuestro blog de empresa. Si quieres puedes leer más en nuestro blog Salesforce en Español.