domingo, 11 de novembro de 2018

Marketing Cloud - Exibindo o primeiro nome com Ampscript

O Ampscript é a linguagem de Script utilizada na plataforma Marketing Cloud (Exacttarget). Através dela é possível criar personalizações em emails e páginas, acessar dados de outras data extensions, fazer customizações dinâmicas nas mensagens, entre outros.

Esse post foi motivado por uma pergunta que recebi de um colega aqui na empresa: "Como uso o ampscript para pegar apenas o primeiro nome de um campo que possui o nome completo?"

Para responder essa pergunta, fiz o seguinte (Nome é a coluna de nome completo da Data Extension):


%%[
  VAR @TamanhoFirstName
  SET @FirstName = Nome
  IF IndexOf(@FirstName, ' ') > 0 THEN
    SET @TamanhoFirstName = IndexOf(@FirstName, ' ')
  ELSE
    SET @TamanhoFirstName = Length(@FirstName)
  ENDIF
]%%

Olá %%=ProperCase(Trim(Substring(@FirstName, 0, @TamanhoFirstName)))=%%,


Inicialmente fiz um IF/ELSE para pegar o tamanho do Primeiro Nome e posteriormente usei algumas funções para buscar o primeiro nome e normalizá-lo. Uma função bem útil é o ProperCase que deixa a 1ª letra maiúscula e as outras minusculas.


* Precisa de um suporte ou consultoria com o Marketing Cloud? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.

sexta-feira, 9 de novembro de 2018

Testando métodos com anotação @future no Salesforce

Ao chamar um método com a anotação @future uma nova thread é criada e enfileirada para ser executada de forma assíncrona à chamada original. Dessa forma, não há qualquer garantia que o conteúdo do método futuro será executado antes ou depois do contexto que o chamou. 

No cenário de método assíncrono surge um "problema": Como criar um método de teste unitário para esse método? Bem, a solução é mais simples do que se imagina: Basta utilizar o Test.StartTest() e o Test.StopTest() e o método assíncrono entre eles. 

A princípio mostro o método que desejo testar (coloquei uma método de espera ocupada só para comprovar a eficácia):


public class ClasseComMetodoFuturo {
    @future
    public static void metodoAssincrono(id idCaso){
        ClasseComMetodoFuturo.sleep(5000);
        
        Case caso = new Case(id = idCaso);
        Caso.Origin = 'Web';
        update caso;
    }
    
    private static void sleep(integer milliseconds){
        Long timeDiff = 0;
        DateTime firstTime = System.now();
        do{
            timeDiff = System.now().getTime() - firstTime.getTime();
        }while(timeDiff <= milliseconds);
    }
}


Agora minha classe de teste:


@isTest
public class ClasseComMetodoFuturoTest {
 public static testmethod void testandoFuture(){
        Case c = new Case();
        insert c;
        
        Test.startTest();
        ClasseComMetodoFuturo.metodoAssincrono(c.id);
        Test.stopTest();
        
        c = [SELECT id, Origin FROM Case WHERE id = :c.id];
        System.assertEquals('Web', c.Origin);
    } 
}



Faça um teste agora, removendo Test.StartTest() e o Test.StopTest(). O Resultado será:


System.AssertException: Assertion Failed: Expected: Web, Actual: null


Isso acontence pois, ao executar o Test.StopTest(), o Salesforce aguarda todas as execuções assíncronas que estão na fila de execução, pendentes para execução. Isto é, o StopTest faz com que seu método de teste aguarde do método @future, podendo assim esperar o resultado.



* Precisa de um suporte ou consultoria com seus códigos Apex na plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.