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