Посібник 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.
  • Дозволяє створювати a одиничне випробування і виконайте їх, щоб перевірити покриття коду та ефективність коду в apex.
  • Apex працює в середовищі з кількома клієнтами Salesforce визначив деякі обмеження регулятора, які перешкоджають користувачеві контролювати спільні ресурси. Будь-який код, який перетинає ліміт регулятора Salesforce, не виконується, з’являється помилка.
  • Об’єкт Salesforce можна використовувати як тип даних у apex. Наприклад -
    Account acc = new Account();

    ,тут обліковий запис є стандартним об’єктом Salesforce.

  • Apex автоматично оновлюється з кожним випуском Salesforce.

Коли розробник повинен вибрати Apex

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

Нижче наведено кілька сценаріїв, коли нам потрібно написати апекс-код:

  • Щоб створити веб-сервіси, які інтегрують Salesforce з іншими програмами.
  • Щоб реалізувати спеціальну перевірку об’єктів.
  • Для виконання спеціальної логіки вершини під час виконання операції DML.
  • Щоб реалізувати функції, які неможливо реалізувати за допомогою наявних потоків робочих процесів і функціональних можливостей конструкторів процесів.
  • Налаштовувати послуги електронної пошти, потрібно включити обробку вмісту, заголовків і вкладень електронної пошти за допомогою коду apex.

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

Тепер у цьому підручнику Apex ми дізнаємось про робочу структуру 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.

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

Інструкція керування потоком корисна, коли ви хочете виконати деякі рядки коду на основі певних умов.

Наприклад:

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
  • Редактор коду в інтерфейсі користувача SalesforceYou

Тип даних в Apex

Apex підтримує такі типи даних:

примітив

ціле число, Double, Long, Date, Date Time, String, ID і Boolean вважаються примітивними типами даних. Усі примітивні типи даних передаються за значенням, а не за посиланням.

колекції

В Apex доступні три типи колекції

  • Список: це впорядкована колекція примітивів, sObjects, колекцій або Apex-об’єктів на основі індексів.
  • Набір: невпорядкована колекція унікальних примітивів.
  • Карта: це набір унікальних примітивних ключів, які відображаються на окремі значення, які можуть бути примітивами, sObjects, колекціями або Apex-об’єктами.

sObject

Це особливий тип даних у Salesforce. Він схожий на таблицю в SQL і містить поля, подібні до стовпців у SQL.

Переліки

Enum — це абстрактний тип даних, який зберігає одне значення кінцевого набору визначених ідентифікаторів

Класи

Об'єкти

Він відноситься до будь-якого типу даних, який підтримується в Apex.

інтерфейси

Специфікатор доступу 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: остаточну змінну вже ініціалізовано.

Повернення

Це ключове слово повертає значення з методу. Наприклад:

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

Null

Він визначає нульову константу і може бути призначений змінній. Наприклад

 Boolean b = null;

Віртуальний

Якщо клас визначено ключовим словом virtual, його можна розширити та замінити.

абстрактний

Якщо клас визначено за допомогою ключового слова abstract, він повинен містити принаймні один метод із ключовим словом abstract, і цей метод має мати лише підпис.

Наприклад

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

Apex String

Рядок — це набір символів без обмежень. Наприклад:

String name = 'Test';

Існує кілька вбудованих методів, які надає клас String у salesforce. Нижче наведено кілька функцій, які найчастіше використовуються:

скоротити (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, що викликає метод, містить указаний підрядок.

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

дорівнює (stringOrId)

Цей метод повертає true, якщо переданий параметр не є нульовим і вказує ту саму двійкову послідовність символів, що й рядок, який викликає метод.

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

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

У наведеному вище прикладі метод equals порівнює 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, який викликає метод, і повертає результуючий рядок.

Наприклад

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(): цей метод видаляє всі пробіли на початку рядка та повертає його.

valueOf(toConvert)

Цей метод повертає рядкове представлення переданого об’єкта.

Межі регулятора Apex

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

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

Apex Getter і Setter

Властивість Apex подібна до змінної Apex. Getter і setter необхідні для властивості вершини. Getter і setter можна використовувати для виконання коду до того, як значення властивості буде доступно або змінено. Код у методі доступу get виконується, коли зчитується значення властивості. Код у наборі інструментів доступу запускається, коли змінюється значення властивості. Будь-яка властивість, що має засіб доступу 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';}
	}
}

Тут ім’я властивості — це name, і це загальнодоступна властивість, і вона повертає рядок dataType.

Не обов’язково мати код у блоці get і set. Цей блок можна залишити порожнім, щоб визначити автоматичну властивість. Наприклад:

public double MyReadWriteProp{ get; set; } 

Отримати та встановити засоби доступу також можна визначити за допомогою їхнього модифікатора доступу. Якщо засіб доступу визначено за допомогою модифікатора, він перевизначає модифікатор доступу для властивості. Наприклад:

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

Клас Апекс

Apex-клас — це проект або шаблон, на основі якого створюються об’єкти. Об’єкт – це екземпляр класу.

Існує три способи створення вершинних класів у Salesforce:

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

Force.com IDE

Сторінка деталей класу Apex.

У apex ви можете визначити зовнішній клас, який також називається класом верхнього рівня, а також ви можете визначити класи всередині зовнішнього класу, які називаються внутрішніми класами.

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

Не обов'язково використовувати модифікатор доступу в оголошенні внутрішніх класів.

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

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

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

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

Синтаксис прикладу класу Apex:

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

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

myApexClass obj = new myApexClass();

Тригер Apex

Тригери Apex дозволяють виконувати настроюваний 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

Тригер Apex

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

Пакетний клас у salesforce використовується для обробки великої кількості записів, які за умови нормальної обробки перевищуватимуть обмеження регулятора вершини. Пакетний клас виконує код асинхронно.

Переваги пакетного класу:

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

Нижче наведено три методи, надані базою даних. Пакетний інтерфейс:

1.start()

Цей метод генерує область записів або об’єктів, які будуть оброблені методом інтерфейсу execute. Під час виконання пакету він викликається лише один раз. Цей метод повертає об’єкт Database.QueryLocator або Iterable. Кількість записів, отриманих за допомогою SQL-запиту за допомогою об’єкта Database.QueryLocator, становить 50 мільйонів записів, але за допомогою ітерації загальна кількість записів, які можна отримати за допомогою SQL-запиту, становить лише 50000 XNUMX. Iterable використовується для створення складної області для пакетного класу.

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

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

2.execute()

Цей метод використовується для обробки кожної порції даних. Для кожного блоку записів викликається метод execute. Стандартний розмір пакета для виконання становить 200 записів. Метод Execute приймає два аргументи:

Посилання на об’єкт Database.BatchableContext,

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

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

3.finish()

Метод Finish викликається один раз під час виконання пакетного класу. Операції постобробки можна виконувати фінішним методом. Наприклад: відправка електронного листа з підтвердженням. Цей метод викликається, коли оброблено весь пакет. Синтаксис методу Finish:

global void finish(Database.BatchableContext BC){}

Об'єкт Database.BatchableContext

Кожен метод бази даних. Інтерфейс Batchable має посилання на об’єкт 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 реалізовано, щоб пакетний клас мав статус.

Якщо ваш пакетний клас реалізував Database , інтерфейс із збереженням стану, усі змінні екземпляра зберігають свої значення, але статичні змінні скидаються між транзакцією.

Підсумки

  • Apex є строго типізованим, об’єктно-орієнтованим мова програмування який компілюється та працює на платформі force.com
  • Мова програмування Apex є мовою, яка не враховує регістр
  • Два типи потоку дій в Apex: 1) дії розробника 2) дії кінцевого користувача
  • Apex допомагає вам створювати веб-сервіси, які інтегрують Salesforce з іншими програмами.
  • Apex підтримує такі типи даних: 1).Primitive 2) Collections 3) sObject, Enums, 4) Classes, 5) Objects and Interfaces
  • Загальнодоступні, приватні, захищені та глобальні підтримують Apex
  • Ключові слова, які використовуються в Apex: 1) із спільним доступом, 2) без спільного використання, 3) статичним, 4) кінцевим, 5) поверненням, 6) нульовим, 7) віртуальним, 8) абстрактним
  • Рядок — це набір символів без обмежень
  • Обмеження регулятора Apex – це обмеження, які застосовуються механізмом виконання apex, щоб гарантувати, що будь-який код вершини злітно-посадкової смуги та процеси
  • Getter і setter можна використовувати для виконання коду до того, як значення властивості буде доступно або змінено
  • Існує три способи створення апекс-класів у Salesforce: 1) Консоль розробника 2) Force.com IDE і 3) Сторінка деталей класу Apex.
  • Тригери Apex дозволяють виконувати настроюваний Apex до та після виконання операції DML.
  • Пакетний клас у salesforce використовується для обробки великої кількості записів, які за умови нормальної обробки перевищуватимуть обмеження регулятора вершини.