sábado, 8 de abril de 2017

Trabalhando com SObject no Apex - Salesforce

Um das coisas mais interessantes de se trabalhar com linguagens de programação Orientadas a Objeto é a possibilidade de se trabalhar com Abstração. No Salesforce, mais especificamente no plataforma Force.com, todos os objetos abstraem de sObject, sendo assim possível, trabalhar de forma genérica com todos os Objetos da Plataforma, sejam eles nativos ou personalizados.

Vamos ao primeiro exemplo de como isso funciona:


    
SObject sObj1 = new Account();
SObject sObj2 = new MeuObjeto__c();


Veja que instanciei um objeto Account e (personalizado) MeuObjeto__c como um sObject sem problemas. Assumindo esse conceito de abstração, consigo, por exemplo atualizar atualizar registros de um Objeto Account ou Personalizado com o mesmo código:


  
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        this.atualizaProprietario(conta, UserInfo.getUserId());
        this.atualizaProprietario(meuObj, UserInfo.getUserId());
    }
    
    public void atualizaProprietario(SObject sObj, id idNovoProprietario){
        sObj.put('OwnerId', idNovoProprietario);
        update sObj;
    }

No método Main, eu busco os dados de objetos diferente (Account e MeuObjeto__c) e chamo um método genérico, chamado atualizaProprietário que tem o poder de atualizar qualquer objeto da plataforma Force.com, afinal todos abstraem de sObject (por isso uso o sObject como parâmetro desse método). No método atualizaProprietário, veja que uso o método put do SObject (que é um Key/Value) para dizer qual campo desejo atualizar (OwnerId) e qual o novo valor (passado por parâmetro).

Bem, vamos ver agora como faço para buscar, de forma genérica, dados de um sObject:


 
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        String nomeConta = this.buscaNome(conta);
        String nomeMeuObj = this.buscaNome(meuObj);
        
        System.debug('Nome da conta: ' + nomeConta);
        System.debug('Nome do meuObj: ' + nomeMeuObj);
    }
    
    public String buscaNome(SObject sObj){
        Object nome = sObj.get('name');
        return String.valueOf(nome);
    }


Observe que, criei um método buscaNome, que utiliza o método get do sObject para buscar o valor de um campo no objeto. O resultado dos System.Debug são:





Por fim, vamos fazer um método que retorne uma String com o tipo do Objeto que foi passado como parâmetro:


 
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        String tipoConta = this.buscaTipo(conta);
        String tipoMeuObj = this.buscaTipo(meuObj);
        
        System.debug('Tipo da conta: ' + tipoConta);
        System.debug('Tipo do meuObj: ' + tipoMeuObj);
    }
    
    public String buscaTipo(SObject sObj){
        Schema.DescribeSObjectResult result = sObj.getSObjectType().getDescribe();
        return result.getName();
    }

Para buscarmos o tipo do Objeto, usamos o método getSObjectType, que retorna um SObjectType e neste usamos o método getDescribe. O describe nos retorna informações informações básicas através do DescribeSObjectResult. No result temos um método getName que nos trás o tipo do Objeto, no caso Account e MeuObjeto__c:





Bem, por hoje é somente isso! :)





* Está precisando de um suporte ou uma consultoria nos desenvolvimentos Apex dentro da sua plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/


Nenhum comentário: