Учебники

2) учебник APEX

Что такое Апекс?

Apex — это строго типизированный объектно-ориентированный язык программирования, который компилируется и работает на платформе force.com. Язык Apex имеет синтаксис, похожий на Java. Код Apex может быть выполнен по нажатию кнопки, веб-ссылок, триггеров и страниц Visualforce. Apex доступен в версиях Salesforce для предприятий, Performance, Unlimited, Developer и Database.com.

В этом обучении Apex для начинающих вы узнаете,

Особенности Apex:

Вот важные особенности Apex:

  • Апекс является регистронезависимым языком.
  • Вы можете выполнять операции DML, такие как INSERT, UPDATE, UPSERT, DELETE для записей sObject, используя apex.
  • Вы можете запросить записи sObject, используя SOQL (язык запросов к объектам salesforce) и SOSL (язык поиска объектов salesforce) в apex.
  • Позволяет создавать модульные тесты и выполнять их для проверки покрытия кода и эффективности кода в вершине.
  • Apex работает в мультитенантной среде, и Salesforce определила некоторые ограничения регулятора, которые не позволяют пользователю контролировать общие ресурсы. Любой код, который пересекает ограничение регулятора Salesforce, завершается ошибкой, появляется ошибка.
  • Объект Salesforce может использоваться как тип данных в вершине. Например —
    Account acc = new Account(); 

    , здесь Account — это стандартный объект продаж.

  • Apex автоматически обновляется с каждым выпуском Salesforce.

Когда разработчик должен выбрать Apex:

Код Apex должен быть написан только в том случае, если бизнес-сценарий слишком сложен и не может быть реализован с использованием встроенных функций, предоставляемых Salesforce.

Ниже приведены несколько сценариев, в которых нам нужно написать апекс-код:

  • Создавать веб-сервисы, интегрирующие Salesforce с другими приложениями.
  • Для реализации пользовательской проверки на объектах.
  • Выполнить пользовательскую логику апекса при выполнении операции DML.
  • Для реализации функциональности, которая не может быть реализована с использованием существующих потоков рабочих процессов и функциональности сборщиков процессов.
  • Чтобы настроить почтовые службы, вам необходимо включить обработку содержимого, заголовков и вложений электронной почты с использованием кода Apex.

Рабочая структура Apex:

Ниже приведен поток действий для кода Apex:

  • Действие разработчика: весь код apex, написанный разработчиком, компилируется в набор инструкций, которые могут быть поняты интерпретатором времени выполнения apex, когда разработчик сохраняет код на платформе, а затем эти инструкции сохраняются в виде метаданных на платформе.
  • Действие конечного пользователя: когда пользовательское событие выполняет код apex, сервер платформы получает скомпилированные инструкции из метаданных и запускает их через интерпретатор apex перед возвратом результата.

Синтаксис Apex:

Объявление переменной:

Поскольку apex является языком со строгой типизацией, необходимо объявить переменную с типом данных в apex.

Например

contact con = new contact(); 

здесь переменная con объявляется с contact как тип данных.

SOQL Query:

SOQL обозначает язык запросов к объектам salesforce. SOQL используется для извлечения записей sObject из базы данных Salesforce. Например-

Account acc = [select id, name from Account Limit 1]; 

The above query fetches account record from salesforce database.

Loop Statement:

Loop statement is used to iterate over the records in a list. The number of iteration is equal to the number of records in the list. For example:

list<Account>listOfAccounts = [select id, name from account limit 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
	//your logic
}

In the above snippet of code, listOfAccounts is a variable of list datatype.

Flow Control Statement:

Flow control statement is beneficial when you want to execute some lines of the code based on some conditions.

For example:

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
}

The above snippet of code is querying account records from the database and checking the list size.

DML statement:

DML stands for data manipulation language. DML statements are used to manipulate data in the Salesforce database. For example —

Account acc = new Account(Name = ‘ Test Account’);
Insert acc; //DML statement to create account record.

Apex Development Environment:

Apex code can be developed either in sandbox and developer edition of Salesforce.

It is a best practice to develop the code in the sandbox environment and then deploys it to the production environment.

Apex code development tools: Following are the three tools available to develop apex code in all editions of Salesforce.

  • Force.com Developer Console
  • Force.com IDE
  • Code Editor in the Salesforce User InterfaceYou

Data Type In Apex:

Following are the datatypes supported by apex:

Примитивный:

Integer, Double, Long, Date, Date Time, String, ID и Boolean рассматриваются как примитивные типы данных. Все примитивные типы данных передаются по значению, а не по ссылке.

Коллекции:

Три типа коллекции доступны в Apex

  • Список: это упорядоченная коллекция примитивов, объектов sObject, коллекций или объектов Apex на основе индексов.
  • Набор: неупорядоченная коллекция уникальных примитивов.
  • Карта: это коллекция уникальных, примитивных ключей, которые отображаются на отдельные значения, которые могут быть примитивами, объектами sObject, коллекциями или объектами Apex.

SObject:

Это специальный тип данных в Salesforce. Он похож на таблицу в SQL и содержит поля, похожие на столбцы в SQL.

Перечисления

Enum — это абстрактный тип данных, в котором хранится одно значение конечного набора указанных идентификаторов.

Классы

Объекты :

Это относится к любому типу данных, который поддерживается в Apex.

Интерфейсы

Спецификатор доступа к Apex:

Ниже приводится спецификатор доступа, поддерживаемый apex:

Общественность:

Этот спецификатор доступа предоставляет доступ к классу, методу, переменной, которая будет использоваться апексом в пространстве имен.

Частный:

Этот спецификатор доступа дает доступ к классу, методу, переменной, которые будут использоваться локально или в разделе кода, он определен. Все техники, переменные, которые не имеют никакого определенного спецификатора доступа, имеют спецификатор доступа по умолчанию private.

Защищено:

Этот спецификатор доступа предоставляет доступ к методу, переменной, которая будет использоваться любыми внутренними классами в пределах определения класса Apex.

Глобальный:

Этот спецификатор доступа предоставляет доступ к классу, методу, переменной, которая будет использоваться апексом в пространстве имен, а также вне пространства имен. Рекомендуется не использовать ключевое слово global до тех пор, пока это не будет необходимо.

Ключевые слова в Apex:

С обменом:

Если класс определен с помощью этого ключевого слова, то применяются все правила общего доступа к текущему пользователю, а если это ключевое слово отсутствует, то код выполняется в контексте системы.

Например:

public with sharing class MyApexClass{
// sharing rules enforced when code in this class execute
}

Без обмена:

Если класс определен с этим ключевым словом, то все правила общего доступа, применяемые к текущему пользователю, не применяются.

Например:

public without sharing class MyApexClass{
// sharing rules is not enforced when code in this class execute
}

Статическая:

Переменная Method определяется с ключевым словом static, инициализируется один раз и связывается с классом. Статические переменные, методы могут вызываться по имени класса напрямую, без создания экземпляра класса.

Финал:

Константа, Method определяется с последним ключевым словом, не может быть переопределена. Например:

public class myCls {
static final Integer INT_CONST = 10;
}

Если вы попытаетесь переопределить значение для этой переменной INT_CONST, вы получите исключение — System.FinalException: Final переменная уже была инициализирована.

Возвращение:

Это ключевое слово возвращает значение из метода. Например:

public String getName() {
return  'Test' ;
}

Значение NULL:

Он определяет нулевую константу и может быть назначен переменной. Например

 Boolean b = null; 

Виртуальные:

Если класс определен с помощью виртуального ключевого слова, его можно расширить и переопределить.

Аннотация:

Если класс определен с ключевым словом abstract, он должен содержать хотя бы один метод с ключевым словом abstract, и этот метод должен иметь только сигнатуру.

Например:

public abstract class MyAbstrtactClass {
abstract Integer myAbstractMethod1();
}

Апекс Строка:

Строка — это набор символов без ограничений по количеству символов. Например:

String name = 'Test';

There are several in-built methods provide by String class in salesforce. Following are the few frequently and mostly used functions:

abbreviate(maxWidth):

This method truncates a string to the specified length and returns it if the length of the given string is longer then specified length; otherwise, it returns the original string. If the value for maxWidth variable is less than 4, this method returns a runtime exception — System.StringException: Minimum abbreviation width is 4

For example:

String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2'+s2); //Hello...

capitalize():

This method converts the first letter of a string to title case and returns it.

For example:

String s = 'hello;
String s2 = s.capitalize();
System.assertEquals('Hello', s2);

contains(substring):

This method returns true if the String calling the method contains the substring specified.

String name1 = 'test1';
String name2 = 'test2';
Boolean flag = name.contains(name2);
System.debug('flag::',+flag); //true

equals(stringOrId):

This method returns true if the parameter passed is not null and indicates the same binary sequence of characters as the string that is calling the method.

While comparing Id values the length of the ID’s may not to be equal. For example: if a string that represents 15 characters id is compared with an object that represents 18 characters ID this method returns true. For example:

Id idValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result4 = stringValue15.equals(IdValue18);
System.debug('result4', +result4); //true

In the above example equals method is comparing 15 characters object Id to 18 characters object Id and if both these id represents the same binary sequence it will return true.

Use this method to make case-sensitive comparisons.

escapeSingleQuotes(stringToEscape):

This method adds an escape character (\) before any single quotation in a string and returns it. This method prevents SOQL injection while creating a dynamic SOQL query. This method ensures that all single quotation marks are considered as enclosing strings, instead of database commands.

For example:

String s = 'Hello Tom';
system.debug(s); // Outputs 'Hello Tom'
String escapedStr = String.escapeSingleQuotes(s);
// Outputs \'Hello Tom\'

remove(substring):

Этот метод удаляет все вхождения упомянутой подстроки из строки, которая вызывает метод, и возвращает результирующую строку.

Например:

String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug( 's2'+ s2);// 'Sales and .com'

подстрока (StartIndex):

Этот метод возвращает подстроку, начинающуюся с символа в startIndex, продолжается до последней строки.

Например:

String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2'+s2); //burger

обеспечить регресс():

Этот метод переворачивает все символы строки и возвращает ее. Например:

String s = 'Hello';
String s2 = s.reverse();
System.debug('s2::::'+s2);// olleH  // Hello

trim (): Этот метод удаляет все первые пробелы из строки и возвращает ее.

valueOf (toConvert):

Этот метод возвращает строковое представление переданного в объект.

Ограничения Губернатора Апекса:

Ограничения регулятора Apex — это ограничения, установленные механизмом времени исполнения apex, чтобы гарантировать, что любой код и процессы apex ВПП не контролируют общие ресурсы и не нарушают обработку для других пользователей в многопользовательской среде. Эти ограничения сверяются с каждой транзакцией апекса. Ниже приведены ограничения регулятора, определенные Salesforce для каждой транзакции Apex:

Описание предел
SOQL-запросы, которые можно выполнять в синхронной транзакции 100
SOQL-запросы, которые можно выполнять в асинхронной транзакции 200
Записи, которые могут быть получены с помощью запроса SOQL 50000
Записи, которые могут быть получены с помощью Database.getQueryLocator 10000
SOSL-запросы, которые можно выполнить в апекс-транзакции 20
Записи, которые могут быть получены с помощью запроса SOSL 2000
Операторы DML, которые могут быть выполнены в апекс-транзакции 150
Записи, которые могут быть обработаны в результате выполнения оператора DML, Approval.process или database.emptyRecycleBin 10000
Выноски, которые могут быть выполнены в апекс-транзакции. 100
Накопительный лимит времени ожидания для всех обратных вызовов, выполняемых в транзакции Apex 120 секунд
Ограничение на количество задач, которые могут быть добавлены в очередь с помощью System.enqueueJob 50
Срок выполнения каждой транзакции Apex 10 минут
Ограничение на символы, которые можно использовать в классе Apex и триггере 1 миллион
Ограничение времени процессора для синхронной транзакции 10 000 миллисекунд
Ограничение времени процессора для асинхронной транзакции 60000 миллисекунд

Апекс геттер и сеттер:

Свойство Apex аналогично переменной Apex. Геттер и сеттер необходимы для свойства апекса. Получатель и установщик могут использоваться для выполнения кода до того, как значение свойства будет доступно или изменено. Код в методе доступа get выполняется при чтении значения свойства. Код в наборе доступа выполняется при изменении значения свойства. Любое свойство, имеющее метод доступа get, считается доступным только для чтения, а любое свойство, имеющее установленный метод доступа, считается записывающим только любое свойство, имеющее методы доступа как get, так и set. Синтаксис свойства апекса:

public class myApexClass {
// Property declaration
	access_modifierreturn_typeproperty_name {
	get {
			//code  
		}
		set{
			//code
		}
	}

Здесь access_modifier — это модификатор доступа к свойству. return_type — это тип данных свойства. property_name — это имя свойства.

Ниже приведен пример свойства apex, имеющего методы доступа get и set.

public class myApex{
	public String name{
		get{ return name;}
		set{ name = 'Test';}
	}
}

Здесь именем свойства является имя, и это публичное свойство, и оно возвращает строку dataType.

Необязательно иметь некоторый код в блоке get и set. Эти блоки можно оставить пустыми, чтобы определить автоматическое свойство. Например:

public double MyReadWriteProp{ get; set; } 

Получить и установить аксессор можно также с помощью их модификатора доступа. Если метод доступа определен с помощью модификатора, он переопределяет модификатор доступа для свойства. Например:

public String name{private get; set;}// name is private for read and public to write.

Apex Class:

Апекс-класс — это проект или шаблон, из которого создаются объекты. Объект является экземпляром класса.

Существует три способа создания апекс-классов в Salesforce:

Консоль разработчика

Force.com IDE

Страница деталей класса Apex.

В apex вы можете определить внешний класс, также называемый классом верхнего уровня, и вы также можете определить классы внутри внешнего класса, называемого внутренними классами.

В объявлении внешнего класса обязательно использовать модификатор доступа типа global или public.

Нет необходимости использовать модификатор доступа в объявлении внутренних классов.

Класс Apex определяется с помощью ключевого слова class, за которым следует имя класса.

Ключевое слово Extends используется для расширения существующего класса с помощью класса Apex, а ключевое слово Implements используется для реализации интерфейса с помощью класса Apex.

Salesforce apex не поддерживает множественное наследование, класс apex может расширять только один существующий класс apex, но может реализовывать несколько интерфейсов.

Класс Apex может содержать пользовательский конструктор, и если пользовательский конструктор недоступен, используется конструктор по умолчанию. Код в конструкторе выполняется при создании экземпляра класса.

Синтаксис апекс-класса:

public class myApexClass{
// variable declaration
//constructor
	public myApexClass{
	}
//methods declaration
}

Ключевое слово new используется для создания экземпляра класса Apex. Ниже приведен синтаксис для создания экземпляра класса Apex.

myApexClass obj = new myApexClass();

Apex Trigger:

Триггеры Apex позволяют вам выполнить пользовательский апекс до и после выполнения операции DML.

Apex поддерживает следующие два типа триггеров:

Перед триггерами: эти триггеры используются для проверки и обновления значения поля перед сохранением записи в базе данных.

После триггеров: эти триггеры используются для доступа к полям (идентификатор записи, поле LastModifiedDate), установленным системой после записи, зафиксированной в базе данных. Значение этих полей можно использовать для изменения других записей. Записи, которые запускаются после триггеров, доступны только для чтения.

Лучше всего писать громоздкие триггеры. Громоздкий триггер может обрабатывать как одну запись, так и несколько записей одновременно.

Синтаксис апекс-триггера:

trigger TriggerName on ObjectName (trigger_events) {
	//Code_block
 }

Здесь TriggerName — это имя триггера, ObjectName — имя объекта, для которого должен быть записан триггер, trigger_events — список событий, разделенных запятыми.

Ниже приведены события, поддерживаемые триггерами Apex: до вставки, до обновления, до удаления, после вставки, после обновления, после удаления, после восстановления.

Статические ключевые слова не могут использоваться в триггере Apex. Все ключевые слова, применимые к внутренним классам, могут использоваться в триггере Apex.

Существуют неявные переменные, определяемые каждым триггером, который возвращает контекст времени выполнения. Эти переменные определены в системе. Триггерный класс. Эти переменные называются переменными контекста. На скриншоте ниже показана переменная контекста, поддерживаемая триггером Apex.

Ниже приводится рассмотрение переменной контекста в триггере apex:

  • Не используйте trigger.new и trigger.old в операциях DML.
  • Trigger.new не может быть удален.
  • Trigger.new только для чтения.
  • Trigger.new может использоваться для изменения значений полей в том же объекте только перед триггером.

Ниже на скриншотах перечислены соображения относительно конкретных действий в различных триггерных событиях.

Пакетный класс в Apex:

Пакетный класс в salesforce используется для обработки большого количества записей, которые превышают пределы регулятора апекса при нормальной обработке. Пакетный класс выполняет код асинхронно.

Ниже приведены преимущества класса партии:

  • Пакетный класс обрабатывает данные в чанках, и если чанк не удается успешно обработать, все успешно обработанные чанки не откатываются.
  • Каждый кусок данных в классе пакета обрабатывается с новым набором ограничений регулятора, которые обеспечивают выполнение кода в пределах ограничений регулятора.
  • База данных. Пакетный интерфейс должен быть реализован классом Apex для использования в качестве класса пакета. Он предоставляет три метода, которые должны быть реализованы классом пакета.

Ниже приведены три метода, предоставляемых базой данных. Пакетный интерфейс:

1.Start ():

Этот метод генерирует область записей или объектов, которые будут обработаны методом интерфейса execute. Во время выполнения пакета он вызывается только один раз. Этот метод возвращает либо объект Database.QueryLocator, либо Iterable. Количество записей, извлеченных с помощью SQL-запроса с использованием объекта Database.QueryLocator, составляет 50 миллионов записей, но с использованием итераций общее количество записей, которое можно извлечь с помощью SQL-запроса, составляет только 50000. Iterable используется для генерации сложной области видимости для класса пакета.

Синтаксис метода запуска:

global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {}

2.execute ():

Этот метод используется для обработки каждого куска данных. Для каждого куска записей вызывается метод execute. Размер пакета по умолчанию для выполнения составляет 200 записей. Метод execute принимает два аргумента:

Ссылка на объект Database.BatchableContext,

Список объектов sObject, например List <sObject>, или список параметризованных типов. Синтаксис метода execute:

global void execute(Database.BatchableContext BC, list<P>){}

3.finish ():

Метод finish вызывается один раз во время выполнения класса пакета. Операции постобработки могут быть выполнены методом финиша. Например: отправка письма с подтверждением. Этот метод вызывается, когда обрабатываются все партии. Синтаксис метода Finish:

global void finish(Database.BatchableContext BC){}

Объект Database.BatchableContext:

Каждый метод базы данных. Пакетный интерфейс имеет ссылку на объект Database.BatchableContext.

Этот объект используется для отслеживания хода выполнения пакетного задания.

Ниже приведены методы экземпляров, предоставляемые BatchableContext:

  • getChildJobId (): Этот метод возвращает идентификатор пакетного задания, которое в данный момент обрабатывается.
  • getJobId (): этот метод возвращает идентификатор пакетного задания.

Ниже приведен синтаксис класса пакета:

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
}
}

Метод Database.executeBatch:

Метод Database.executeBatch используется для выполнения класса пакета.

Этот метод принимает два параметра: экземпляр класса пакета, который нужно обработать, параметр Options, чтобы указать размер пакета, если он не указан, по умолчанию он равен 200.

Синтаксис Database.executeBatch:

Database.executeBatch(myBatchObject,scope)

Выполнение имени класса пакета MyBatchClass:

MyBatchClassmyBatchObject = new MyBatchClass(); 
Id batchId = Database.executeBatch(myBatchObject,100);

Database.stateful:

Пакетный класс по умолчанию не имеет состояния. Каждый раз, когда вызывается метод execute, получается новая копия объекта, все переменные класса инициализируются.

Database.stateful реализован, чтобы сделать пакетный класс с сохранением состояния.

Если ваш пакетный класс реализовал базу данных, интерфейс с сохранением состояния всех переменных экземпляра сохраняет свои значения, но статические переменные сбрасываются между транзакциями.

Резюме:

  • Apex — это строго типизированный объектно-ориентированный язык программирования Apex, который компилируется и работает на платформе force.com.
  • Apex — это язык без учета регистра
  • Два типа последовательности действий в Apex: 1) действие разработчика 2) действие конечного пользователя
  • Apex поможет вам создать веб-сервисы, интегрирующие Salesforce с другими приложениями.
  • Типы данных, поддерживаемые apex: 1) .Primitive 2) коллекции 3) sObject, Enums, 4) классы, 5) объекты и интерфейсы
  • Публичная, Частная, Защищенная и Глобальная указана поддержка Apex
  • Ключевые слова, используемые в Apex: 1) с общим доступом, 2) без общего доступа, 3) статический, 4) финальный 5) возврат, 6) нулевой, 7) виртуальный, 8) абстрактный
  • Строка — это набор символов без ограничений
  • Ограничения регулятора Apex — это ограничения, установленные движком Apex для обеспечения того, чтобы любой код и процессы Apex на ВПП
  • Получатель и установщик могут использоваться для выполнения кода до того, как значение свойства будет доступно или изменено
  • Существует три способа создания классов Apex в Salesforce: 1) Консоль разработчика 2) IDE Force.com и 3) Страница сведений о классе Apex.
  • Триггеры Apex позволяют вам выполнить пользовательский апекс до и после выполнения операции DML.
  • Пакетный класс в salesforce используется для обработки большого количества записей, которые превышают пределы регулятора апекса при нормальной обработке.