segunda-feira, 26 de dezembro de 2016

Dica rápida: Link da instância Salesforce em uma Fórmula

Caso precise do Link da instância da sua Org Salesforce, em uma fórmula, vai uma dica rápida para se ter esse link:

 LEFT($Api.Partner_Server_URL_260, FIND( '/services', $Api.Partner_Server_URL_260))  

Após essas instruções, basta concatenar o que deseja para formar sua URL com a instância Salesforce.

Essa era rapidinha ;)












domingo, 11 de dezembro de 2016

Atribuindo Tarefas para um Papel - Workflow

A pouco me deparei com uma situação inusitada. Criei uma nova regra de fluxo de trabalho (Workflow), com uma ação de criação de uma Tarefa (Task). Essa tarefa era atribuída a um Papel (Role).

















Porém, no momento que a regra de fluxo de trabalho era executada, percebi que a Tarefa era criada, porém não atribuía corretamento ao usuário do Papel. Essa tarefa acabava sendo atribuída a mim. Fui pesquisar o ocorrido e descobri que o Salesforce só atribui corretamente uma tarefa a um usuário de um papel, se existir apenas 1 usuário com aquele papel. No caso da minha Org, existiam 2 usuários com o mesmo papel. Então o Salesforce atribui a tarefa ao proprietário do registro relacionado à tarefa. No caso eu. Pelo que li também, caso não exista nenhum usuário com o referido papel, o comportamento do Salesforce será o mesmo. Veja a referência:

https://help.salesforce.com/HTViewSolution?id=000213466&language=en_US


Bem, por agora é isso!



domingo, 4 de dezembro de 2016

Inserindo posts no Chatter com arquivo anexo

Para inserir uma mensagem no Chatter, com um arquivo anexo, via Apex (em uma trigger ou classe), é necessário usar o objeto FeedItem. Sem mais delongas, vamos fazer um exemplo que permita inserir um texto no Chatter e um arquivo TXT anexo, com os dados de algumas Contas (Account).


   String conteudoArquivoTxt = 'Segue a relação de Contas: \r\n';  
   List<Account> listaDeContas = [SELECT id, name, website FROM Account Limit 10];  
   for (Account conta : listaDeContas){  
     conteudoArquivoTxt += 'Nome: ' + conta.name + ' | Website: ' + conta.Website + '\r\n';  
   }  
   FeedItem post = new FeedItem();  
   post.ParentId = UserInfo.getUserId();  
   post.Body = 'Lista de Contas. Favor conferir!';  
   post.Type = 'ContentPost';  
   post.ContentData = Blob.valueOf(conteudoArquivoTxt);  
   post.ContentFileName = 'RelacaoContas.txt';  
   insert post;  

A primeira coisa que é importante ressaltar nesse código é: Você não conseguirá rodá-lo na versão de API 36.0 ou superior. Esse código é válido até a versão 35.0. Isto é, se tentar no console do desenvolvedor, na parte de "Open Execute Anonymous Window", ele não funcionará, pois este usa a API mais recente. Então, para inciar os testes, use esse código em uma acionador (trigger) ou classe. No entando, quando for salvar esse código em uma classe ou trigger, altere a API de execução da trigger ou classe para 35 ou inferior:


Veja que, na classe ou trigger, basta acessar a guia Version Settings. E na API do Salesforce, marcar a versão 35 ou inferior.

Bem, agora que nosso código já funciona, vamos passar alguns itens importantes do código:


   String conteudoArquivoTxt = 'Segue a relação de Contas: \r\n';   
   List<Account> listaDeContas = [SELECT id, name, website FROM Account Limit 10];   
   for (Account conta : listaDeContas){   
    conteudoArquivoTxt += 'Nome: ' + conta.name + ' | Website: ' + conta.Website + '\r\n';   
   }   

Inicialmente eu salvo na variável "conteudoArquivoTxt" o conteúdo que desejo exibir no meu arquivo TXT que será salvo junto com a postagem no Chatter. Posteriormente coloco mais conteúdo nessa variável, iterando em uma lista de contas.

Em seguida, instancio um objeto do tipo "FeedItem", que será responsável pela postagem no Chatter:


   FeedItem post = new FeedItem();   

Logo após, através da propriedade "ParentId", eu digo aonde irá ser publicado a postagem. Nesse caso, estou indicando que será publicada na linha do tempo do usuário que está executando o código:



   post.ParentId = UserInfo.getUserId();    

Nas propriedade Body e Type, eu informo o conteúdo da postagem e o tipo de conteúdo, respectivamente. No caso do Type, há uma lista de opções para se usar. Usamos o ContentPost, pois significa que estamos postando texto com um arquivo anexo.



   post.Body = 'Lista de Contas. Favor conferir!';   
   post.Type = 'ContentPost';   

Para conhecer os outros tipos (Type) de conteúdo disponíveis para esse campo, veja a documentação oficial do Salesforce, relacionado ao FeedItem:
https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_feeditem.htm


Nos campos ContentData e ContentFileName, eu informo o corpo do arquivo texto que será anexado e o nome do arquivo txt, respectivamente. Repare que foi necessário converter a String da minha variável conteudoArquivoTxt para o tipo Blob.


   post.ContentData = Blob.valueOf(conteudoArquivoTxt);   
   post.ContentFileName = 'RelacaoContas.txt';   

E para concluir o código, dou o Insert no objeto post (tipo FeedItem) para realizar a postagem no Chatter, de fato:


   insert post;   

Veja o resultado da postagem no Chatter: