Учебное пособие APEX: класс программирования Apex и примеры кодирования

Что такое Apex в Salesforce?

Вершина — это объектно-ориентированный и строго типизированный язык программирования, разработанный Salesforce для создания программного обеспечения как услуги (SaaS) и управления взаимоотношениями с клиентами (CRM). Apex помогает разработчикам создавать сторонние приложения SaaS и добавлять бизнес-логику к системным событиям, обеспечивая поддержку внутренней базы данных и интерфейсы клиент-сервер.

Apex помогает разработчикам добавлять бизнес-логику к системным событиям, таким как нажатия кнопок, обновления связанных записей и страницы Visualforce. Apex имеет аналогичный синтаксис Java. Зарегистрируйтесь в Salesforce узнать, как работает CRM

Особенности языка программирования Apex

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

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

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

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

Когда разработчику следует выбрать Apex

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

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

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

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

Теперь в этом уроке Apex мы узнаем о рабочей структуре Apex:

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

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

Синтаксис апекса

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

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

Например:

contact con = new contact(); 

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

SOQL-запрос

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

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

Приведенный выше запрос извлекает запись об учетной записи из базы данных Salesforce.

Оператор цикла

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

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

В приведенном выше фрагменте кода listOfAccounts — это переменная типа данных списка.

Заявление об управлении потоком

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

Например:

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
}

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

Заявление DML

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

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

Среда разработки Apex

Теперь в этом руководстве по программированию Apex мы узнаем о среде разработки Apex:

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

Рекомендуется разрабатывать код в изолированной среде, а затем развертывать его в производственной среде.

Среда разработки Apex

Инструменты разработки кода Apex. Ниже приведены три инструмента, доступные для разработки кода Apex во всех выпусках Salesforce.

  • Консоль разработчика Force.com
  • Force.com IDE
  • Редактор кода в пользовательском интерфейсе SalesforceВы

Тип данных в Apex

Ниже приведены типы данных, поддерживаемые apex:

Примитивный

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

Коллекции

В Apex доступны три типа сбора.

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

sОбъект

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

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

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

Классы

Объекты

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

Интерфейсы

Спецификатор доступа к вершине

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

Общая

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

Частные

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

Защищенный

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

Глобальный

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

Ключевые слова в 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, инициализируется один раз и связывается с классом. Статические переменные и методы можно вызывать напрямую по имени класса, не создавая экземпляр класса.

Завершение

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

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

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

ВОЗВРАТ

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

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

Значение Null

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

 Boolean b = null;

Виртуальный

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

Резюме

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

Например

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

Апексная строка

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

String name = 'Test';

В Salesforce есть несколько встроенных методов, предоставляемых классом String. Ниже приведены несколько часто и наиболее часто используемых функций:

сократить (maxWidth)

Этот метод усекает строку до указанной длины и возвращает ее, если длина данной строки превышает указанную длину; в противном случае возвращается исходная строка. Если значение переменной maxWidth меньше 4, этот метод возвращает исключение времени выполнения — System.StringException: минимальная ширина сокращения — 4.

Например:

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

капитализировать ()

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

Например:

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

содержит (подстроку)

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

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

равно (строкаOrId)

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

При сравнении значений идентификаторов длина идентификаторов может не совпадать. Например: если строка, представляющая идентификатор из 15 символов, сравнивается с объектом, представляющим идентификатор из 18 символов, этот метод возвращает true. Например:

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

В приведенном выше примере метод равенства сравнивает идентификатор объекта из 15 символов с идентификатором объекта из 18 символов, и если оба этих идентификатора представляют одну и ту же двоичную последовательность, он вернет true.

Используйте этот метод для сравнения с учетом регистра.

escapeSingleQuotes (stringToEscape)

Этот метод добавляет escape-символ (\) перед любой одинарной кавычкой в ​​строке и возвращает его. Этот метод предотвращает внедрение SOQL при создании динамического запроса SOQL. Этот метод гарантирует, что все одинарные кавычки рассматриваются как включающие строки, а не как команды базы данных.

Например:

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

удалить (подстроку)

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

Например

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

подстрока (начальныйиндекс)

Этот метод возвращает подстроку, начинающуюся с символа в 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(): этот метод удаляет из строки все начальные пробелы и возвращает ее.

значениеOf(toConvert)

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

Пределы губернатора Apex

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

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

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

Свойство Apex аналогично переменной apex. Для свойства вершины необходимы геттер и сеттер. Геттер и сеттер можно использовать для выполнения кода до того, как значение свойства будет доступно или изменено. Код в методе доступа get выполняется при чтении значения свойства. Код в методе доступа set запускается при изменении значения свойства. Любое свойство, имеющее метод доступа get, считается доступным только для чтения, любое свойство, имеющее метод доступа set, считается доступным только для записи. Любое свойство, имеющее метод доступа 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';}
	}
}

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

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

public double MyReadWriteProp{ get; set; } 

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

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

Класс Apex

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

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

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

Force.com IDE

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

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

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

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

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

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

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

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

Синтаксис примера класса Apex:

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

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

myApexClass obj = new myApexClass();

Триггер вершины

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

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

Триггеры «До». Эти триггеры используются для проверки и обновления значения поля перед сохранением записи в базе данных.

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

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

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

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

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

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

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

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

Триггер вершины

Триггер вершины

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

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

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

Триггер вершины

Триггер вершины

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

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

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

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

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

1.старт()

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

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

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

2.выполнить()

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

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

Список sObjects, например List или список параметризованных типов. Синтаксис метода выполнения:

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

3.закончить()

Метод завершения вызывается один раз во время выполнения пакетного класса. Операции постобработки могут выполняться в методе завершения. Например: отправка письма с подтверждением. Этот метод вызывается, когда обрабатывается весь пакет. Синтаксис метода 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);

База данных.stateful

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

Database.stateful реализован для сохранения состояния пакетного класса.

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

Резюме

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