Progredir com as fórmulas avançadas

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:
  • Implementar fórmulas avançadas para corresponder a casos de uso complexos.
  • Escrever fórmulas nítidas e fáceis de entender.

Fórmulas avançadas

Vimos muitas fórmulas complicadas neste módulo. No entanto, nem sempre é fácil transformar um problema dos negócios em uma solução baseada em fórmulas. Esta unidade tem algumas dicas para levar suas fórmulas da teoria para a prática.

Descreva

Quando tiver uma ideia para uma fórmula, pense nela na linguagem do dia a dia antes de abrir o Editor de fórmula avançado. Comece perguntando qual é seu objetivo e descrevendo-o como se fosse uma conversa.

Este exemplo veio da Trailblazer Community do Salesforce: Digamos que seu objetivo é garantir que, se alguém além de um administrador do sistema marcar uma oportunidade como “Fechada e perdida”, essa pessoa terá que dar uma explicação.

Neste exemplo, supomos que você já tenha o campo lista de opções personalizada, Motivo da perda, preenchido com motivos válidos para perder uma oportunidade. Como ninguém deve conseguir salvar um registro sem apresentar um motivo, usamos uma fórmula de regra de validação para atingir nossa meta.

Em linguagem simples, sua fórmula é:

Mostrar um erro quando o Estágio de uma oportunidade for alterado para “Fechada e perdida” por alguém que não seja um administrador do sistema e o Motivo da perda estiver em branco.

Depois de escrever sua fórmula, procure palavras-chave como “e”, “ou” e “se”, que correspondem às funções usadas neste módulo. Essas funções são os tijolos que usamos para construir fórmulas maiores e mais complicadas. Reconhecê-las em seus casos de uso ajuda a implementar essas fórmulas.

Para verificar se o usuário não é um administrador do sistema, insira $Profile.Name, um campo de mesclagem que representa o perfil que faz edições ao registro. Para verificar se StageName foi atualizado, use ISCHANGED(). ISCHANGED() retorna true se o valor atual de um campo for diferente do valor anterior.

Você pode verificar o restante de seus requisitos com o ISPICKVAL(). Para obter mais informações sobre ISPICKVAL(), consulte Usar listas de opções em fórmulas.

  1. Em Configuração, use a caixa Busca rápida para acessar o Gerenciador de objetos.
  2. Clique em Oportunidade | Regras de validação.
  3. Clique em Novo.
  4. Em Nome da regra, insira Motivo da perda obrigatório.
  5. Em Fórmula de condição de erro, insira a seguinte fórmula:
    AND(
      $Profile.Name <> "System Administrator",
      ISCHANGED(StageName),
      ISPICKVAL(StageName, "Closed Lost"),
      ISPICKVAL(Loss_Reason__c, "")
    )
  6. Em Mensagem de erro, insira Oportunidades não podem ser marcadas como fechada e perdida sem informar o motivo da perda.
  7. Em Local do erro, selecione Campo e Motivo da perda.
  8. Clique em Salvar.

Agora, sempre que um usuário que não seja um administrador do sistema marcar uma oportunidade como Fechada e perdida, uma mensagem de erro será exibida.

Usar espaçamento e formatação claros

As fórmulas são fáceis de ler e compreender quando você usa espaçamento e formatação apropriados. Quando trabalhamos em fórmulas de texto, escrevemos uma fórmula que atribui dinamicamente uma classificação a um lead com base no país, receita e origem.

IF(AND(AnnualRevenue > 1000000, CONTAINS(CASE(Country,
"United States", "US", "America", "US", "USA", "US", "US", "US",
"NA"), "US")), IF(ISPICKVAL(LeadSource, "Partner Referral"),
"Hot", IF(OR(ISPICKVAL (LeadSource, "Purchased List"),
ISPICKVAL(LeadSource, "Web")), "Warm”, "Cold")), "Cold")

Embora essa fórmula esteja sintaticamente correta, é quase impossível saber o que ela faz ou como a lógica funciona. Como os espaços em branco e as quebras de linha são desconsiderados pelas fórmulas, é fácil tornar sua fórmula mais legível usando espaços. Aqui está a mesma fórmula, mas mais nítida com recuos e quebras de linha.

IF(
  AND(AnnualRevenue > 1000000,
  CONTAINS(CASE(Country, "United States", "US", "America",
    "US", "USA", "US", "US", "US", "NA"), "US")),
  IF(
    ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
    IF(
      OR(
        ISPICKVAL(LeadSource, "Purchased List"),
        ISPICKVAL(LeadSource, "Web")
      ), "Warm”, "Cold"
    )
  ), "Cold"
)

Embora não haja regras rígidas e rápidas para formatar fórmulas, recomendamos que você faça o recuo com dois espaços sempre que aninhar uma declaração lógica. Quando você usa o recuo de forma correta e uniforme, fica mais fácil ver em qual função está trabalhando e evitar parênteses incompatíveis.

Outra maneira de tornar as declarações lógicas mais fáceis de ler é usando operadores lógicos em vez de funções. Quando você usa && em vez de AND(), ou || em vez de OR(), fica mais fácil para quem lê sua fórmula seguir o fluxo lógico. Aqui está a mesma fórmula mais uma vez, com && e || em vez de AND() e OR().

IF(
  AnnualRevenue > 1000000 &&
  CONTAINS(CASE(Country, "United States", "US", "America", "US",
    "USA", "US", "US", "US", "NA"), "US"),
  IF(
    ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
    IF(
      ISPICKVAL(LeadSource, "PurchasedList") ||
      ISPICKVAL(LeadSource, "Web"),
      "Warm", "Cold"
    )
  ), "Cold"
)

Seja breve

Ao escrever uma fórmula complicada, é fácil se atolar em declarações lógicas aninhadas e referências a outros campos. Muitas vezes, a fórmula mais simples é a melhor fórmula.

Esta fórmula de regra de validação retorna true se a data de fechamento de uma oportunidade não estiver no mês atual
OR (
CloseDate < DATE( YEAR(TODAY()), MONTH(TODAY()), 1),
IF (
AND (
MONTH (TODAY() ) =1,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =2,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 28)),
true,
IF (
AND (
MONTH (TODAY() ) =3,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =4,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =5,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =6,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =7,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =8,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =9,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =10,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =11,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =12,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true, false
)))))))))))))
Esta verificação complexa determina se a data de fechamento é anterior ao primeiro dia do mês atual ou posterior ao último dia deste mês. Mas, na verdade, o dia não tem importância: se o mês e o ano da data de fechamento forem os mesmos que o mês e o ano do mês atual, então é o mesmo mês. Assim, podemos reescrever a fórmula como:
NOT(
  AND(
    MONTH( CloseDate ) = MONTH( TODAY() ),
    YEAR( CloseDate ) = YEAR( TODAY() )
  )
)
Esse nova versão é muito mais legível e só compila 200 caracteres, em comparação com os mais de 3.000 da fórmula original. Se sua fórmula parece mais complicada do que deveria ser, provavelmente é. Tente abordar o problema de um ângulo diferente para simplificar as coisas.