quarta-feira, 7 de setembro de 2016

Exclusão de registros no PageBlockTable - SFDC

Hoje precisei de criar uma página Visualforce, que possuía uma lista de registros em um PageBlockTable. Nessa tabela (PageBlockTable) eu precisei também incluir uma funcionalidade de exclusão de registros e é isso que vou compartilhar hoje.

Criei inicialmente no Salesforce, uma página Visualforce com uma tabela de contas. Essa tabela foi criada através um pageBlockTable com uma Column que exibe o nome (name) da Conta e outra coluna com o Link para exclusão. Veja:


 <apex:page controller="AccountController">  
   <apex:form>    
     <apex:PageBlock>  
       <apex:pageBlockTable id="Contas" value="{!listaContas}" var="itemConta" title="Lista de Contas">        
         <apex:column headerValue="Nome" value="{!itemConta.name}" />          
         <apex:column headerValue="">  
           <apex:commandLink value="Apagar" action="{!Excluir}" onclick="return window.confirm('Deseja realmente remover essa Conta?');">  
             <apex:param name="contaId" value="{!itemConta.Id}" assignTo="{!idAccountDelete}"/>  
           </apex:commandLink>  
         </apex:column>          
       </apex:pageBlockTable>   
     </apex:PageBlock>      
   </apex:form>  
 </apex:page>  

Repare que na segunda coluna no meu Visualforce, eu uso o apex:CommandLink para criar um link de exclusão do registro:


 <apex:commandLink value="Apagar" action="{!Excluir}" onclick="return window.confirm('Deseja realmente remover essa Conta?');">  
    <apex:param name="contaId" value="{!itemConta.Id}" assignTo="{!idAccountDelete}"/>  
 </apex:commandLink>  


Nesse CommandLink eu referencio o método (action) que será chamado na minha classe controller (irei falar dela mais a frente). Esse método, dei o nome de Excluir. Também coloquei um recurso JavaScript para confirmar a exclusão (window.confirm), através da propriedade onclick.
Logo em seguida uso o apex:param para atribuir o ID daquela conta da linha (da tabela), à propriedade idAccountDelete. Essa será usada para definir a exclusão.

Veja agora como ficou minha classe controller. Inicialmente defino a lista que será usada para popular a PageBlockTable e a propriedade (acima descrita) que armazenará o ID da Conta que será excluída. Em seguida o construtor da classe controller e o método de exclusão:


 public class AccountController {  
   public Id idAccountDelete { get; set; }  
   public List<Account> listaContas { get; set; }  
   public AccountController(){  
     this.listaContas = [SELECT id, name FROM Account ORDER BY name];  
   }  
   public PageReference Excluir(){  
     Account conta = [SELECT id FROM Account WHERE id = :this.idAccountDelete];  
     delete conta;  
     return null;  
   }  
 }  

Veja que no construtor - public AccountController() - busco os dados que serão exibidos na tabela. Já no método de exclusão - public PageReference Excluir() - Eu apago a conta, baseada na propriedade idAccountDelete, que recebeu o ID da conta da linha (da tabela), em que se clicou no link "Apagar".

O resultado final foi:


Página Visualforce renderizada


Mensagem para confirmação da exclusão



sábado, 27 de agosto de 2016

Removendo link da data atual do

A ideia desse post é mostrar a forma de remover o link da data atual, no componente <apex:Inputfield /> quando esse está referenciado uma data, em uma página Visualforce, no Salesforce.










Bem, para remover a data atual, precisamos usar o seguinte código CSS:


   <style>  
     div.hideCurrDate span.dateInput span.dateFormat{  
       display:none;  
     }  
   </style>  

E colocarmos o nosso <apex:Inputfield /> dentro de uma div, referenciando a classe CSS:


      <div class="hideCurrDate">  
           <apex:inputField value="{!acc.DataUltimaCompra__c}"/>  
      </div>  


Dessa forma, temos o seguinte resultado:









quinta-feira, 25 de agosto de 2016

Validação de CPF e CNPJ com regra de validação

Hoje vai uma dica rápida para criar uma regra de validação para validar um campo que contenha CPF ou CPNJ no Salesforce. Criamos para esse exemplo um campo cuja o nome de API é CNPJ_CPF__c, no objeto que desejo realizar a validação (Account - Conta, por exemplo).

Dei um nome para a regra de validação e na formula para validação, inseri o seguinte código:


   

 IF( LEN( CNPJ_CPF__c )= 14   
 ,   
 NOT(   
 OR(   
 LEN(CNPJ_CPF__c)=0,   
 AND( NOT(CNPJ_CPF__c = "00000000000000"),   
 MOD(MOD(11-MOD(VALUE(MID(CNPJ_CPF__c,1,1))*5+VALUE(MID(CNPJ_CPF__c,2,1))*4+VALUE(MID(CNPJ_CPF__c,3,1))*3+VALUE(MID(CNPJ_CPF__c,4,1))*2+VALUE(MID(CNPJ_CPF__c,5,1))*9+VALUE(MID(CNPJ_CPF__c,6,1))*8+VALUE(MID(CNPJ_CPF__c,7,1))*7+VALUE(MID(CNPJ_CPF__c,8,1))*6+VALUE(MID(CNPJ_CPF__c,9,1))*5+VALUE(MID(CNPJ_CPF__c,10,1))*4+VALUE(MID(CNPJ_CPF__c,11,1))*3+VALUE(MID(CNPJ_CPF__c,12,1))*2,11),11),10) =   
 VALUE(MID(CNPJ_CPF__c,13,1)),   
 MOD(MOD(11-MOD(VALUE(MID(CNPJ_CPF__c,1,1))*6+VALUE(MID(CNPJ_CPF__c,2,1))*5+VALUE(MID(CNPJ_CPF__c,3,1))*4+VALUE(MID(CNPJ_CPF__c,4,1))*3+VALUE(MID(CNPJ_CPF__c,5,1))*2+VALUE(MID(CNPJ_CPF__c,6,1))*9+VALUE(MID(CNPJ_CPF__c,7,1))*8+VALUE(MID(CNPJ_CPF__c,8,1))*7+VALUE(MID(CNPJ_CPF__c,9,1))*6+VALUE(MID(CNPJ_CPF__c,10,1))*5+VALUE(MID(CNPJ_CPF__c,11,1))*4+VALUE(MID(CNPJ_CPF__c,12,1))*3+VALUE(MID(CNPJ_CPF__c,13,1))*2,11),11),10) =   
 VALUE(MID(CNPJ_CPF__c,14,1))   
 )))   
 ,
 IF(LEN(CNPJ_CPF__c) < 11, TRUE, 
 NOT AND (CNPJ_CPF__c <> '00000000000',CNPJ_CPF__c <> '11111111111',   
 CNPJ_CPF__c <> '22222222222',CNPJ_CPF__c <> '33333333333',CNPJ_CPF__c <> '44444444444',CNPJ_CPF__c <> '55555555555',CNPJ_CPF__c <> '66666666666',CNPJ_CPF__c <> '77777777777',CNPJ_CPF__c <> '88888888888',CNPJ_CPF__c <> '99999999999',   
 IF ((MID(CNPJ_CPF__c , 10, 1) =   
 IF (MOD(((VALUE(MID(CNPJ_CPF__c , 1, 1))*10)+   
 (VALUE(MID(CNPJ_CPF__c , 2, 1))*9)+   
 (VALUE(MID(CNPJ_CPF__c , 3, 1))*8)+   
 (VALUE(MID(CNPJ_CPF__c , 4, 1))*7)+   
 (VALUE(MID(CNPJ_CPF__c , 5, 1))*6)+   
 (VALUE(MID(CNPJ_CPF__c , 6, 1))*5)+   
 (VALUE(MID(CNPJ_CPF__c , 7, 1))*4)+   
 (VALUE(MID(CNPJ_CPF__c , 8, 1))*3)+   
 (VALUE(MID(CNPJ_CPF__c , 9, 1))*2)),11) < 2,'0',   
 TEXT(11 - MOD(((VALUE(MID(CNPJ_CPF__c , 1, 1))*10)+   
 (VALUE(MID(CNPJ_CPF__c , 2, 1))*9)+   
 (VALUE(MID(CNPJ_CPF__c , 3, 1))*8)+   
 (VALUE(MID(CNPJ_CPF__c , 4, 1))*7)+   
 (VALUE(MID(CNPJ_CPF__c , 5, 1))*6)+   
 (VALUE(MID(CNPJ_CPF__c , 6, 1))*5)+   
 (VALUE(MID(CNPJ_CPF__c , 7, 1))*4)+   
 (VALUE(MID(CNPJ_CPF__c , 8, 1))*3)+   
 (VALUE(MID(CNPJ_CPF__c , 9, 1))*2)),11))   
 )),TRUE,FALSE),   
 IF ((MID(CNPJ_CPF__c , 11, 1) =   
 IF (MOD(((VALUE(MID(CNPJ_CPF__c , 1, 1))*11)+   
 (VALUE(MID(CNPJ_CPF__c , 2, 1))*10)+   
 (VALUE(MID(CNPJ_CPF__c , 3, 1))*9)+   
 (VALUE(MID(CNPJ_CPF__c , 4, 1))*8)+   
 (VALUE(MID(CNPJ_CPF__c , 5, 1))*7)+   
 (VALUE(MID(CNPJ_CPF__c , 6, 1))*6)+   
 (VALUE(MID(CNPJ_CPF__c , 7, 1))*5)+   
 (VALUE(MID(CNPJ_CPF__c , 8, 1))*4)+   
 (VALUE(MID(CNPJ_CPF__c , 9, 1))*3)+   
 (VALUE(MID(CNPJ_CPF__c , 10, 1))*2)),11) < 2,'0',   
 TEXT(11 - MOD(((VALUE(MID(CNPJ_CPF__c , 1, 1))*11)+   
 (VALUE(MID(CNPJ_CPF__c , 2, 1))*10)+   
 (VALUE(MID(CNPJ_CPF__c , 3, 1))*9)+   
 (VALUE(MID(CNPJ_CPF__c , 4, 1))*8)+   
 (VALUE(MID(CNPJ_CPF__c , 5, 1))*7)+   
 (VALUE(MID(CNPJ_CPF__c , 6, 1))*6)+   
 (VALUE(MID(CNPJ_CPF__c , 7, 1))*5)+   
 (VALUE(MID(CNPJ_CPF__c , 8, 1))*4)+   
 (VALUE(MID(CNPJ_CPF__c , 9, 1))*3)+   
 (VALUE(MID(CNPJ_CPF__c , 10, 1))*2)),11))   
 )),TRUE,FALSE)   
 )   
 )
 )


Coloquei a mensagem de "CPF ou CNPJ inválido!", preenchi onde eu gostaria que exibisse o erro e salvei.




Observação importante: Essa validação não permite a utilização pontos, hífens e barras na composição do CPF/CNPJ. Apenas números. Apesar disso, o campo criado é Texto. Agora nada de CPFs ou CNPJs inválidos na sua Org.

Agradeço ao Allan Pecli por me alertar e corrigir alguns itens nessa validação. Se alguém perceber algum problema e quiser colaborar, fique a vontade para me notificar. Valeu Allan!


* Está precisando de um suporte ou consultoria para customização de regras de validação da sua plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/




terça-feira, 21 de junho de 2016

Removendo ou inserindo menu lateral de criação rápida - Salesforce

Ao inciarmos os trabalhos em uma nova Org, nos deparamos com a opção de criação de registros, de forma rápida, na barra lateral, ao acessarmos uma guia. Veja:




Para remover esse opção (ou inserir, caso não esteja aparecendo para você), acesse a parte de configurações do Salesforce: Criar / Personalização / Interface do Usuário. Marque ou desmarque (de acordo com seu objetivo) a opção "Mostrar criação rápida".




Por fim, clique em "Salvar" no final da página.





sábado, 14 de maio de 2016

Campo fórmula - Convertendo texto para número

Essa é uma dica rápida na criação de campos fórmula (formula fields) no Salesforce! 

Caso precise converter uma campo texto para numérico, na fórmula, utilize a função VALUE(texto):


 VALUE('05')  

Vamos criar uma formula com na Oportunidade. Pegaremos o valor total da oportunidade (Amount) e dividir por um campo que criamos (ValorTotal__c), que representa a quantidade de parcelas:


 2000 / VALUE(QuantidadeParcelas__c)  



segunda-feira, 9 de maio de 2016

Campo fórmula - Convertendo Lista de Opções para Texto

Essa é uma dica rápida para utilização de campo Lista de Opções em campos formula (formula fields) no Salesforce. Como é conhecido, ao tentar referenciar diretamente um campo Lista de Opções em uma fórmula, o Salesforce acusa um problema. Isto acontece porque o campo Lista de Opções armazena uma referência ao valor e não ele diretamente. Então precisamos converter esse valor para utilizar em nossas fórmulas. Conversão essa que não é necessária em códigos Apex.

Bem, para utilizar o campo Lista de Opções em uma fórmula, utilize a função TEXT(CampoListaOpcoes__c):


 TEXT(CampoListaOpcoes__c)  

Ou


 "Valor da Lista de Opções: " & TEXT(CampoListaOpcoes__c)  





domingo, 8 de maio de 2016

Convertendo List em Set e Set em List no Apex

Em algumas situações, me vi obrigado a converter uma collection List em um Set ou um Set em List em uma classe Apex. Creio que você também! É claro que, por serem estruturas diferentes, a quantidade de registros de um List (que permite itens repetidos) pode ser maior que de um Set (que não permite repetidos). Mas vamos ao código.

Inicialmente a conversão de List para Set:

 List<Integer> listDeInteiros = new List<Integer> {1, 2, 3, 3};  
 Set<Integer> setDeInteiros = new Set<Integer>(listDeInteiros);  
 system.assertEquals(4, listDeInteiros.size());  
 system.assertEquals(3, setDeInteiros.size());  



Agora a conversão de Set para List:


 Set<Integer> setDeInteiros = new Set<Integer> {1, 2, 3, 3};  
 Set<Integer> listDeInteiros = new Set<Integer>(setDeInteiros);  
 system.assertEquals(3, setDeInteiros.size());  
 system.assertEquals(3, listDeInteiros.size());  


É possível também, caso já possua um Set em uso, acrescentar toda a List ao Set:


 List<Integer> listDeInteiros = new List<Integer>{1, 2, 3};  
 Set<Integer> setDeInteiros = new Set<Integer> {0};  
 setDeInteiros.addAll(listDeInteiros);  
 system.assertEquals(4, setDeInteiros.size());  



E o contrário... Set ao List:


 Set<Integer> setDeInteiros = new Set<Integer>{1, 2, 3};  
 List<Integer> listDeInteiros = new List<Integer> {0};  
 listDeInteiros.addAll(setDeInteiros);  
 system.assertEquals(4, listDeInteiros.size());