Tutorial APEX: aulas de programação Apex e exemplos de codificação
O que é Apex no Salesforce?
ápice é uma linguagem de programação orientada a objetos e fortemente tipada desenvolvida pela Salesforce para a construção de Software como Serviço (SaaS) e Gerenciamento de Relacionamento com o Cliente (CRM). Apex ajuda os desenvolvedores a criar aplicativos SaaS de terceiros e adicionar lógica de negócios a eventos do sistema, fornecendo suporte de banco de dados back-end e interfaces cliente-servidor.
O Apex ajuda os desenvolvedores a adicionar lógica de negócios aos eventos do sistema, como cliques em botões, atualizações de registros relacionados e páginas do Visualforce. Apex tem uma sintaxe semelhante a Java. Registre-se no Salesforce para saber como funciona o CRM
Recursos da linguagem de programação Apex
Aqui estão os recursos importantes do Salesforce Apex:
- Apex é uma linguagem que não diferencia maiúsculas de minúsculas.
- Você pode executar operações DML como INSERT, UPDATE, UPSERT, DELETE em registros sObject usando apex.
- Você pode consultar registros sObject usando SOQL (linguagem de consulta de objeto do Salesforce) e SOSL (linguagem de pesquisa de objeto do Salesforce) no apex.
- Permite que você crie um teste de unidade e executá-los para verificar o Cobertura de código e eficiência do código no apex.
- O Apex é executado em um ambiente multilocatário e Salesforce definiu alguns limites do governador que impedem um usuário de controlar os recursos compartilhados. Qualquer código que ultrapasse o limite do Salesforce Governor falha e um erro é exibido.
- O objeto Salesforce pode ser usado como um tipo de dados no apex. Por exemplo -
Account acc = new Account();
, aqui Conta é um objeto padrão do Salesforce.
- O Apex é atualizado automaticamente a cada versão do Salesforce.
Quando o desenvolvedor deve escolher o Apex
O código Apex só deverá ser escrito se um cenário de negócios for muito complexo e não puder ser implementado usando a funcionalidade pré-criada fornecida pelo Salesforce.
A seguir estão alguns cenários em que precisamos escrever o código Apex:
- Para criar serviços web que integram o Salesforce com outros aplicativos.
- Para implementar validação personalizada em sobjects.
- Para executar a lógica apex personalizada quando uma operação DML é executada.
- Para implementar funcionalidades que não podem ser implementadas usando fluxos de fluxos de trabalho existentes e funcionalidades de construtores de processos.
- Para configurar serviços de email, você precisa incluir o processamento do conteúdo, cabeçalhos e anexos de e-mail usando o código apex.
Estrutura de trabalho do Apex
Agora neste tutorial do Apex, aprenderemos sobre a estrutura de trabalho do Apex:
A seguir está o fluxo de ações para um código Apex:
- Ação do desenvolvedor: todo o código apex escrito por um desenvolvedor é compilado em um conjunto de instruções que podem ser entendidas pelo interpretador de tempo de execução apex quando o desenvolvedor salva o código na plataforma e essas instruções são salvas como metadados na plataforma.
- Ação do usuário final: quando o evento do usuário executa um código apex, o servidor da plataforma obtém as instruções compiladas dos metadados e as executa por meio do interpretador apex antes de retornar o resultado.
Sintaxe do ápice
Declaração de Variável
Como apex é uma linguagem fortemente tipada, é obrigatório declarar uma variável com tipo de dados em apex.
Por exemplo:
contact con = new contact();
aqui a variável con é declarada com contato como tipo de dados.
Consulta SOQL
SOQL significa linguagem de consulta de objetos do Salesforce. SOQL é usado para buscar registros sObject do banco de dados Salesforce. Por exemplo-
Account acc = [select id, name from Account Limit 1];
A consulta acima busca o registro da conta no banco de dados do Salesforce.
Declaração de loop
A instrução Loop é usada para iterar os registros em uma lista. O número de iterações é igual ao número de registros na lista. Por exemplo:
list<Account>listOfAccounts = [select id, name from account limit 100]; // iteration over the list of accounts for(Account acc : listOfAccounts){ //your logic }
No trecho de código acima, listOfAccounts é uma variável do tipo de dados lista.
Declaração de controle de fluxo
A instrução de controle de fluxo é benéfica quando você deseja executar algumas linhas do código com base em algumas condições.
Por exemplo:
list<Account>listOfAccounts = [select id, name from account limit 100]; // execute the logic if the size of the account list is greater than zero if(listOfAccounts.size() >0){ //your logic }
O trecho de código acima consulta registros de contas do banco de dados e verifica o tamanho da lista.
Declaração DML
DML significa linguagem de manipulação de dados. Instruções DML são usadas para manipular dados no banco de dados Salesforce. Por exemplo -
Account acc = new Account(Name = ‘ Test Account’); Insert acc; //DML statement to create account record.
Ambiente de desenvolvimento Apex
Agora neste tutorial de programação Apex, aprenderemos sobre o Apex Development Environment:
O código Apex pode ser desenvolvido no sandbox e na edição para desenvolvedores do Salesforce.
É uma prática recomendada desenvolver o código no ambiente sandbox e, em seguida, implantá-lo no ambiente de produção.
Ferramentas de desenvolvimento de código Apex: A seguir estão as três ferramentas disponíveis para desenvolver código Apex em todas as edições do Salesforce.
- Console do desenvolvedor Force.com
- IDE Force.com
- Editor de código na interface do usuário do SalesforceVocê
Tipo de dados no Apex
A seguir estão os tipos de dados suportados pelo apex:
Primitivo
Inteiro, Double, Long, Date, Date Time, String, ID e Boolean são considerados tipos de dados primitivos. Todos os tipos de dados primitivos são passados por valor, não por referência.
Coleções
Três tipos de coleta estão disponíveis no Apex
- Lista: É uma coleção ordenada de primitivos, sObjects, coleções ou objetos Apex baseados em índices.
- Conjunto: uma coleção não ordenada de primitivas exclusivas.
- Mapa: é uma coleção de chaves primitivas exclusivas que são mapeadas para valores únicos que podem ser primitivos, sObjects, coleções ou objetos Apex.
objeto
Este é um tipo de dados especial no Salesforce. É semelhante a uma tabela em SQL e contém campos semelhantes às colunas do SQL.
Enums
Enum é um tipo de dados abstrato que armazena um valor de um conjunto finito de identificadores especificados
Classes
objetos
Refere-se a qualquer tipo de dados compatível com Apex.
Interfaces
Especificador de acesso Apex
A seguir estão os especificadores de acesso suportados pelo apex:
Público
Este especificador de acesso dá acesso a uma classe, método e variável a ser usada por um ápice dentro de um namespace.
Privado
Este especificador de acesso dá acesso a uma classe, método, variável a ser usada localmente ou dentro da seção de código definida. Toda a técnica, variáveis que não possuem nenhum especificador de acesso definido possuem o especificador de acesso padrão private.
Protegido
Este especificador de acesso dá acesso a um método, variável a ser usado por qualquer classe interna dentro da definição da classe Apex.
Global
Este especificador de acesso dá acesso a uma classe, método e variável a ser usada por um ápice dentro de um namespace, bem como fora do namespace. É uma prática recomendada não usar palavras-chave globais até que seja necessário.
Palavras-chave no Apex
Com compartilhamento
Se uma classe for definida com esta palavra-chave, todas as regras de compartilhamento aplicáveis ao usuário atual serão aplicadas e se esta palavra-chave estiver ausente, o código será executado no contexto do sistema.
Por exemplo:
public with sharing class MyApexClass{ // sharing rules enforced when code in this class execute }
Sem compartilhar
Se uma classe for definida com esta palavra-chave, todas as regras de compartilhamento aplicadas ao usuário atual não serão aplicadas.
Por exemplo:
public without sharing class MyApexClass{ // sharing rules is not enforced when code in this class execute }
Estático
Uma variável, Método, é definida com a palavra-chave estática, é inicializada uma vez e associada à classe. Variáveis estáticas e métodos podem ser chamados diretamente pelo nome da classe, sem criar a instância de uma classe.
final
Uma constante, Método é definido com a palavra-chave final e não pode ser substituída. Por exemplo:
public class myCls { static final Integer INT_CONST = 10; }
Se você tentar substituir o valor desta variável INT_CONST, você receberá uma exceção – System.FinalException: A variável final já foi inicializada.
Devolução
Esta palavra-chave retorna um valor de um método. Por exemplo:
public String getName() { return 'Test' ; }
Nulo
Ele define uma constante nula e pode ser atribuído a uma variável. Por exemplo
Boolean b = null;
Virtual
Se uma classe for definida com uma palavra-chave virtual, ela poderá ser estendida e substituída.
Sumário
Se uma classe for definida com a palavra-chave abstract, ela deverá conter pelo menos um método com a palavra-chave abstract, e esse método deverá ter apenas uma assinatura.
Por exemplo
public abstract class MyAbstrtactClass { abstract Integer myAbstractMethod1(); }
Seqüência de Ápice
Uma string é um conjunto de caracteres sem limite de caracteres. Por exemplo:
String name = 'Test';
Existem vários métodos integrados fornecidos pela classe String no Salesforce. A seguir estão algumas funções usadas com frequência e principalmente:
abreviar (largura máxima)
Este método trunca uma string para o comprimento especificado e a retorna se o comprimento da string fornecida for maior que o comprimento especificado; caso contrário, ele retornará a string original. Se o valor da variável maxWidth for menor que 4, este método retorna uma exceção de tempo de execução – System.StringException: a largura mínima da abreviatura é 4
Por exemplo:
String s = 'Hello World'; String s2 = s.abbreviate(8); System.debug('s2'+s2); //Hello...
capitalizar()
Este método converte a primeira letra de uma string em maiúsculas e minúsculas e a retorna.
Por exemplo:
String s = 'hello; String s2 = s.capitalize(); System.assertEquals('Hello', s2);
contém (substring)
Este método retorna verdadeiro se a String que chama o método contém a substring especificada.
String name1 = 'test1'; String name2 = 'test2'; Boolean flag = name.contains(name2); System.debug('flag::',+flag); //true
é igual(stringOrId)
Este método retorna verdadeiro se o parâmetro passado não for nulo e indica a mesma sequência binária de caracteres da string que está chamando o método.
Ao comparar os valores de Id, o comprimento dos IDs pode não ser igual. Por exemplo: se uma string que representa um ID de 15 caracteres for comparada com um objeto que representa um ID de 18 caracteres, este método retornará verdadeiro. Por exemplo:
Id idValue15 = '001D000000Ju1zH'; Id idValue18 = '001D000000Ju1zHIAR'; Boolean result4 = stringValue15.equals(IdValue18); System.debug('result4', +result4); //true
No exemplo acima, o método equals está comparando o ID do objeto de 15 caracteres com o ID do objeto de 18 caracteres e se ambos os ID representarem a mesma sequência binária, ele retornará verdadeiro.
Use este método para fazer comparações que diferenciam maiúsculas de minúsculas.
escapeSingleQuotes(stringToEscape)
Este método adiciona um caractere de escape (\) antes de qualquer aspa simples em uma string e o retorna. Este método evita a injeção de SOQL ao criar uma consulta SOQL dinâmica. Este método garante que todas as aspas simples sejam consideradas como strings delimitadoras, em vez de comandos de banco de dados.
Por exemplo:
String s = 'Hello Tom'; system.debug(s); // Outputs 'Hello Tom' String escapedStr = String.escapeSingleQuotes(s); // Outputs \'Hello Tom\'
remover(substring)
Este método remove todas as ocorrências da substring mencionada da String que chama o método e retorna a string resultante.
Por exemplo
String s1 = 'Salesforce and force.com'; String s2 = s1.remove('force'); System.debug( 's2'+ s2);// 'Sales and .com'
substring(startIndex)
Este método retorna uma substring que começa no caractere em startIndex e se estende até o último da string.
Por exemplo:
String s1 = 'hamburger'; String s2 = s1.substring(3); System.debug('s2'+s2); //burger
marcha ré()
Este método inverte todos os caracteres de uma string e a retorna. Por exemplo:
String s = 'Hello'; String s2 = s.reverse(); System.debug('s2::::'+s2);// olleH // Hello
trim(): Este método remove todos os espaços em branco iniciais de uma string e os retorna.
valorOf(paraConverter)
Este método retorna a representação em string do objeto passado.
Limites do Governador Apex
Os limites do governador do Apex são os limites impostos pelo mecanismo de tempo de execução do apex para garantir que qualquer código e processo do apex da pista não controlem os recursos compartilhados e não violem o processamento para outros usuários no ambiente multilocatário. Esses limites são verificados em cada transação apex. A seguir estão os limites do governador definidos pela força de vendas em cada transação apex:
Descrição | Limitar |
---|---|
Consultas SOQL que podem ser feitas em uma transação síncrona | 100 |
Consultas SOQL que podem ser feitas em uma transação assíncrona | 200 |
Registros que podem ser recuperados por uma consulta SOQL | 50000 |
Registros que podem ser recuperados por Database.getQueryLocator | 10000 |
Consultas SOSL que podem ser feitas em uma transação apex | 20 |
Registros que podem ser recuperados por uma consulta SOSL | 2000 |
Instruções DML que podem ser feitas em uma transação apex | 150 |
Registros que podem ser processados como resultado de uma instrução DML, Approval.process ou database.emptyRecycleBin | 10000 |
Chamadas que podem ser feitas em uma transação apex. | 100 |
Limite de tempo limite cumulativo em todas as chamadas que estão sendo executadas em uma transação apex | 120 segundos |
Limite de trabalhos apex que podem ser adicionados à fila com System.enqueueJob | 50 |
Limite de tempo de execução para cada transação Apex | 10 minutos |
Limite de caracteres que podem ser usados em uma classe Apex e gatilho | 1 milhões |
Limite de tempo de CPU para transação síncrona | 10,000 milissegundos |
Limite de tempo de CPU para transação assíncrona | 60,000 milissegundos |
Apex Getter e Setter
A propriedade Apex é semelhante à variável apex. Getter e setter são necessários para uma propriedade de ápice. Getter e setter podem ser usados para executar código antes que o valor da propriedade seja acessado ou alterado. O código no acessador get é executado quando um valor de propriedade é lido. O código no acessador set é executado quando um valor de propriedade é alterado. Qualquer propriedade com acessador get é considerada somente leitura, qualquer propriedade com acessador set é considerada para gravação, apenas qualquer propriedade com acessador get e set é considerada leitura-gravação. Sintaxe de uma propriedade apex:
public class myApexClass { // Property declaration access_modifierreturn_typeproperty_name { get { //code } set{ //code } }
Aqui, access_modifier é o modificador de acesso da propriedade. return_type é o dataType da propriedade. property_name é o nome da propriedade.
Abaixo está um exemplo de uma propriedade apex com acessador get e set.
public class myApex{ public String name{ get{ return name;} set{ name = 'Test';} } }
Aqui, o nome da propriedade é nome, é propriedade pública e está retornando uma string dataType.
Não é obrigatório ter algum código no bloco get e set. Estes blocos podem ser deixados vazios para definir uma propriedade automática. Por exemplo:
public double MyReadWriteProp{ get; set; }
O acessador get e set também pode ser definido com seu modificador de acesso. Se um acessador for definido com um modificador, ele substituirá o modificador de acesso da propriedade. Por exemplo:
public String name{private get; set;}// name is private for read and public to write.
Classe Apex
Uma classe apex é um projeto ou modelo a partir do qual os objetos são criados. Um objeto é a instância de uma classe.
Existem três maneiras de criar classes apex no Salesforce:
Console do desenvolvedor
IDE Force.com
Página de detalhes da classe Apex.
No apex, você pode definir uma classe externa também chamada de classe de nível superior e também pode definir classes dentro de uma classe externa chamada de classes internas.
É obrigatório usar modificador de acesso como global ou público na declaração da classe externa.
Não é necessário utilizar modificador de acesso na declaração de classes internas.
Uma classe apex é definida usando a palavra-chave class seguida pelo nome da classe.
A palavra-chave Extends é usada para estender uma classe existente por uma classe apex, e a palavra-chave implements é usada para implementar uma interface por uma classe apex.
O Salesforce Apex não oferece suporte a múltiplas heranças. Uma classe Apex só pode estender uma classe Apex existente, mas pode implementar várias interfaces.
Uma classe apex pode conter um construtor definido pelo usuário e, se um construtor definido pelo usuário não estiver disponível, um construtor padrão será usado. O código em um construtor é executado quando uma instância de uma classe é criada.
Sintaxe do exemplo da classe Apex:
public class myApexClass{ // variable declaration //constructor public myApexClass{ } //methods declaration }
A palavra-chave new é usada para criar uma instância de uma classe apex. Abaixo está a sintaxe para criar uma instância de uma classe apex.
myApexClass obj = new myApexClass();
Acionador do Apex
Os acionadores do Apex permitem executar o apex personalizado antes e depois da execução de uma operação DML.
Suporte Apex seguindo dois tipos de gatilhos:
Antes dos gatilhos: Esses gatilhos são usados para validar e atualizar o valor do campo antes do registro ser salvo no banco de dados.
Gatilhos posteriores: Esses gatilhos são usados para acessar os campos (ID do registro, campo LastModifiedDate) definidos pelo sistema após um registro confirmado no banco de dados. O valor desses campos pode ser usado para modificar outros registros. Os registros que são acionados após os gatilhos são somente leitura.
É uma prática recomendada escrever gatilhos volumosos. Um gatilho volumoso pode processar um único registro, bem como vários registros ao mesmo tempo.
Sintaxe de um gatilho apex:
trigger TriggerName on ObjectName (trigger_events) { //Code_block }
Aqui, TriggerName é o nome do gatilho, ObjectName é o nome do objeto no qual o gatilho será escrito, trigger_events é a lista de eventos separados por vírgula.
A seguir estão os eventos suportados pelos gatilhos apex: antes da inserção, antes da atualização, antes da exclusão, após a inserção, após uma atualização, após a exclusão, após a recuperação.
Palavras-chave estáticas não podem ser usadas em um gatilho do Apex. Todas as palavras-chave aplicáveis às classes internas podem ser usadas em um gatilho do Apex.
Existem variáveis implícitas definidas por cada gatilho que retorna o contexto de tempo de execução. Essas variáveis são definidas no sistema. Classe de gatilho. Essas variáveis são chamadas de variáveis de contexto. A captura de tela abaixo mostra a variável de contexto suportada pelo gatilho apex.
A seguir estão as considerações da variável de contexto no gatilho apex:
- Não use trigger.new e trigger.old em operações DML.
- Trigger.new não pode ser excluído.
- Trigger.new é somente leitura.
- Trigger.new pode ser usado para alterar os valores dos campos no mesmo objeto apenas antes do gatilho.
As capturas de tela abaixo listam as considerações sobre ações específicas em diferentes eventos de gatilho.
Classe de lote no Apex
A classe de lote no Salesforce é usada para processar um grande número de registros que excederiam os limites do governador apex se processados normalmente. A classe Batch executa o código de forma assíncrona.
A seguir estão as vantagens da classe em lote:
- A classe em lote processa os dados em pedaços e se um pedaço não for processado com sucesso, todos os pedaços processados com sucesso não serão revertidos.
- Cada pedaço de dados em uma classe em lote é processado com um novo conjunto de limites do governador que garante que o código seja executado dentro dos limites de execução do governador.
- Base de dados. A interface em lote deve ser implementada por uma classe Apex para ser usada como uma classe em lote. Ele fornece três métodos que devem ser implementados pela classe batch.
A seguir estão os três métodos fornecidos pelo banco de dados. Interface em lote:
1.início()
Este método gera o escopo dos registros ou objetos a serem processados pelo método de interface execute. Durante a execução do lote, ele é chamado apenas uma vez. Este método retorna um objeto Database.QueryLocator ou um Iterable. O número de registros recuperados pela consulta SQL usando o objeto Database.QueryLocator é de 50 milhões de registros, mas usando um iterável, o número total de registros que podem ser recuperados pela consulta SQL é apenas 50000. Iterable é usado para gerar escopo complexo para classe de lote.
Sintaxe do método start:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {}
2.executar()
Este método é usado para o processamento de cada bloco de dados. Para cada pedaço de registros o método execute é chamado. O tamanho padrão do lote para execução é de 200 registros. O método Execute leva dois argumentos:
Uma referência ao objeto Database.BatchableContext,
Uma lista de sObjects, como List ou uma lista de tipos parametrizados. Sintaxe do método de execução:
global void execute(Database.BatchableContext BC, list<P>){}
3.terminar()
O método final é chamado uma vez durante a execução da classe em lote. As operações de pós-processamento podem ser realizadas no método de acabamento. Por exemplo: envio do email de confirmação. Este método é chamado quando todo o lote é processado. Sintaxe do método Finish:
global void finish(Database.BatchableContext BC){}
Objeto Database.BatchableContext
Cada método do banco de dados. A interface Batchable tem uma referência ao objeto Database.BatchableContext.
Este objeto é usado para rastrear o progresso do trabalho em lote.
A seguir estão os métodos de instância fornecidos por BatchableContext:
- getChildJobId(): este método retorna o ID de um trabalho em lote que está processado atualmente.
- getJobId(): este método retorna o ID do trabalho em lote.
Abaixo está a sintaxe de uma classe em lote:
global class MyBatchClass implements Database.Batchable<sObject> { global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) { // collect the batches of records or objects to be passed to execute } global void execute(Database.BatchableContextbc, List<P> records){ // process each batch of records } global void finish(Database.BatchableContextbc){ // execute any post-processing operations } }
Método Database.executeBatch
O método Database.executeBatch é usado para executar uma classe em lote.
Este método usa dois parâmetros: Instância da classe de lote a ser processada, parâmetro Opções para especificar o tamanho do lote, se não for especificado, ele assume o tamanho padrão de 200.
Sintaxe de Database.executeBatch:
Database.executeBatch(myBatchObject,scope)
Executando um nome de classe em lote MyBatchClass :
MyBatchClassmyBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject,100);
Banco de dados.stateful
A classe de lote não tem estado por padrão. Cada vez que o método execute é chamado, uma nova cópia de um objeto é recebida, todas as variáveis da classe são inicializadas.
Database.stateful é implementado para tornar uma classe de lote com estado.
Se sua classe em lote implementou o banco de dados , interface com estado, todas as variáveis de instância mantêm seus valores, mas as variáveis estáticas são redefinidas entre as transações.
Resumo
- Apex é um software fortemente tipado e orientado a objetos linguagem de programação que compila e roda na plataforma force.com
- A linguagem de programação Apex é uma linguagem que não diferencia maiúsculas de minúsculas
- Dois tipos de fluxo de ações no Apex são 1) Ação do desenvolvedor 2) Ação do usuário final
- Apex ajuda você a criar serviços web que integram o Salesforce com outros aplicativos.
- Os tipos de dados suportados pelo apex são: 1).Primitivo 2) Coleções 3) sObject, Enums, 4) Classes, 5) Objetos e Interfaces
- Público, Privado, Protegido e Global são suporte especificado pela Apex
- As palavras-chave usadas no Apex são: 1) Com compartilhamento, 2) Sem compartilhamento, 3) Estático, 4) Final 5) Retorno, 6) Nulo, 7) Virtual, 8) Resumo
- Uma string é um conjunto de caracteres sem limite de caracteres
- Os limites do governador Apex são os limites aplicados pelo mecanismo de tempo de execução apex para garantir que qualquer código e processo do apex da pista
- Getter e setter podem ser usados para executar código antes que o valor da propriedade seja acessado ou alterado
- Existem três maneiras de criar classes Apex no Salesforce: 1) Console do desenvolvedor 2) IDE Force.com e 3) Página de detalhes da classe Apex.
- Os acionadores do Apex permitem executar o apex personalizado antes e depois da execução de uma operação DML.
- A classe de lote no Salesforce é usada para processar um grande número de registros que excederiam os limites do governador apex se processados normalmente.