Samouczek Salesforce Apex dla początkujących

⚡ Inteligentne podsumowanie

Programowanie Apex oferuje programistom Salesforce obiektowy, silnie typowany język do dodawania niestandardowej logiki biznesowej do CRM. Obsługuje klasy, wyzwalacze i zadania wsadowe, a limity zarządcze zapewniają stabilność współdzielonej platformy wielodostępnej.

  • 🧱 Foundation: Apex to język niewrażliwy na wielkość liter Java-podobną składnię, która działa natywnie na platformie Salesforce Lightning.
  • 🗃️ Dostęp do danych: Zapytania SOQL i polecenia DML pozwalają kodowi odczytywać i zapisywać rekordy sObject bezpośrednio w bazie danych Salesforce.
  • 🛠️. Realizacja: Klasy, właściwości i wyzwalacze dołączają niestandardową logikę do wstawiania, aktualizowania, usuwania i innych zdarzeń systemowych rekordów.
  • 📦 Skala: Batch Apex i inne rozwiązania asynchroniczne umożliwiają przetwarzanie milionów rekordów w blokach, nie przekraczając ograniczeń platformy.
  • 🚦 Limity gubernatora: Limity na transakcję, takie jak 100 synchronicznych zapytań SOQL i 150 poleceń DML, chronią współdzielone zasoby.
  • Jakość: Testy jednostkowe muszą obejmować co najmniej 75 procent kodu Apex przed wdrożeniem produkcyjnym.

Przegląd programowania APEX Salesforce

Czym jest Apex w Salesforce?

Wierzchołek to obiektowy i silnie typowany język programowania opracowany przez Salesforce do tworzenia aplikacji SaaS (Software as a Service) i CRM (Customer Relationship Management). Apex pomaga programistom tworzyć aplikacje SaaS innych firm i dodawać logikę biznesową do zdarzeń systemowych, zapewniając obsługę zaplecza bazy danych i interfejsy klient-serwer.

Apex pomaga programistom dodawać logikę biznesową do zdarzeń systemowych, takich jak kliknięcia przycisków, aktualizacje powiązanych rekordów i strony Visualforce. Składnia Apex jest podobna do… Java. Zarejestruj się w Salesforce aby dowiedzieć się jak działa CRM.

Funkcje języka programowania Apex

Oto ważne funkcje Salesforce Apex:

  • W języku Apex wielkość liter nie ma znaczenia.
  • Za pomocą Apex można wykonywać operacje DML, takie jak INSERT, UPDATE, UPSERT i DELETE na rekordach sObject.
  • W systemie Apex można wykonywać zapytania dotyczące rekordów sObject przy użyciu języka SOQL (Salesforce Object Query Language) i SOSL (Salesforce Object Search Language).
  • Umożliwia tworzenie test jednostkowy i wykonaj go, aby sprawdzić Pokrycie kodu i wydajność kodu w Apex.
  • Apex działa w środowisku wielu dzierżawców i Salesforce Zdefiniował limity zarządcy, które uniemożliwiają użytkownikowi monopolizowanie współdzielonych zasobów. Każdy kod, który przekroczy limit zarządcy Salesforce, kończy się niepowodzeniem i pojawia się błąd.
  • Obiekt Salesforce może być używany jako typ danych w Apex. Na przykład:
    Account acc = new Account();

    W tym przypadku Konto jest standardowym obiektem Salesforce.

  • Apex aktualizuje się automatycznie przy każdej nowej wersji Salesforce.

Kiedy deweloper powinien wybrać Apex?

Kod Apex należy pisać wyłącznie wtedy, gdy scenariusz biznesowy jest zbyt skomplikowany, aby można go było wdrożyć przy użyciu wbudowanej funkcjonalności „wskaż i kliknij” udostępnianej przez Salesforce.

Poniżej przedstawiono kilka scenariuszy, w których konieczne jest napisanie kodu Apex:

  • Tworzenie usług internetowych integrujących Salesforce z innymi aplikacjami.
  • W celu wdrożenia niestandardowej walidacji w obiektach sObject.
  • Aby wykonać niestandardową logikę Apex, gdy wykonywana jest operacja DML.
  • Wdrożenie funkcjonalności, której nie można zbudować za pomocą istniejących deklaratywnych narzędzi automatyzacji, takich jak Flow.
  • Ustawić usługi poczty elektronicznej które przetwarzają zawartość, nagłówki i załączniki wiadomości przychodzących.

Gdy już wiesz, kiedy Apex jest właściwym wyborem, kolejnym krokiem jest zrozumienie, co dzieje się z kodem po jego zapisaniu.

Struktura robocza Apex

Poniżej przedstawiono przepływ działań dla kodu Apex:

  • Działanie programisty: Gdy programista zapisuje kod na platformie, cały kod Apex jest kompilowany do zestawu instrukcji zrozumiałych dla interpretera środowiska wykonawczego Apex. Instrukcje te są następnie zapisywane jako metadane na platformie.
  • Działanie użytkownika końcowego: Gdy zdarzenie użytkownika wykonuje kod Apex, serwer platformy pobiera skompilowane instrukcje z metadanych i przepuszcza je przez interpreter Apex przed zwróceniem wyniku.

Poniższy diagram pokazuje, w jaki sposób działania dewelopera i użytkownika końcowego wchodzą w interakcję z serwerem aplikacji platformy Lightning:

Struktura robocza wierzchołka

Środowisko programistyczne Apex

Kod Apex można tworzyć zarówno w środowisku testowym, jak i w organizacji Developer Edition platformy Salesforce.

Dobrą praktyką jest tworzenie kodu w środowisku testowym, a następnie wdrażanie go w środowisku produkcyjnym, jak pokazano poniżej:

Środowisko programistyczne Apex

Narzędzia do tworzenia kodu Apex: Poniżej przedstawiono trzy narzędzia dostępne do tworzenia kodu Apex we wszystkich edycjach Salesforce:

  • Konsola programisty
  • Visual Studio Code z pakietem rozszerzeń Salesforce (zastępuje on wycofane środowisko IDE Force.com)
  • Code edytor w interfejsie użytkownika konfiguracji Salesforce

Mając już gotowe środowisko, przyjrzyjmy się podstawowym elementom języka, zaczynając od typów danych.

Typy danych w Apex

Poniżej przedstawiono typy danych obsługiwane przez Apex:

Prymitywny

Liczba całkowita, DoubleTypy danych Long, Date, Datetime, Decimal, Time, Blob, String, ID i Boolean są uważane za prymitywne. Wszystkie prymitywne typy danych są przekazywane przez wartość, a nie przez referencję.

Kategorie

W Apex dostępne są trzy typy kolekcji:

  • Lista: Jest to uporządkowany zbiór prymitywów, sObjectów, kolekcji lub obiektów Apex oparty na indeksach.
  • Ustaw: Nieuporządkowana kolekcja unikatowych elementów niezawierająca duplikatów.
  • Mapa: Jest to zbiór unikatowych kluczy, które są odwzorowywane na pojedyncze wartości, które mogą być prymitywami, obiektami sObject, kolekcjami lub obiektami Apex.

sObiekt

To specjalny typ danych w Salesforce. Jest podobny do stołu w SQL i zawiera pola podobne do kolumn w SQL.

Enums

Enum jest liczbą abstracTyp danych przechowujący jedną wartość skończonego zbioru określonych identyfikatorów.

Klasy, obiekty i interfejsy

Zdefiniowane przez użytkownika klasy i interfejsy Apex mogą być również używane jako typy danych. Obiekt odnosi się do instancji dowolnego typu danych obsługiwanego w Apex.

Składnia wierzchołka

Deklaracja zmiennej

Ponieważ Apex jest językiem silnie typizowanym, deklarowanie zmiennej z typem danych w Apex jest obowiązkowe.

Na przykład:

Contact con = new Contact();

Tutaj zadeklarowano zmienną con z typem danych Contact.

Zapytanie SOQL

SOQL to skrót od Salesforce Object Query Language (SSL). Służy do pobierania rekordów sObject z bazy danych Salesforce. Na przykład:

Account acc = [SELECT Id, Name FROM Account LIMIT 1];

Powyższe zapytanie pobiera rekord konta z bazy danych Salesforce.

Instrukcja pętli

Instrukcja pętli służy do iterowania po rekordach na liście. Liczba iteracji jest równa liczbie rekordów na liście. Na przykład:

List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
	//your logic
}

W powyższym fragmencie kodu listOfAccounts jest zmienną typu danych Lista.

Oświadczenie dotyczące kontroli przepływu

Instrukcja sterowania przepływem jest przydatna, gdy chcesz wykonać określone wiersze kodu na podstawie pewnych warunków.

Na przykład:

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
}

Powyższy fragment kodu pobiera z bazy danych rekordy kont i sprawdza rozmiar listy.

Oświadczenie DML

DML to skrót od Data Manipulation Language (język manipulacji danymi). Instrukcje DML służą do manipulowania danymi w bazie danych Salesforce. Na przykład:

Account acc = new Account(Name = 'Test Account');
insert acc; //DML statement to create account record.

Specyfikatory dostępu Apex

Poniżej przedstawiono specyfikatory dostępu obsługiwane przez Apex:

Publiczne

Ten specyfikator dostępu zapewnia dostęp do klasy, metody lub zmiennej, która ma być używana przez Apex w przestrzeni nazw.

Prywatne

Ten specyfikator dostępu zapewnia dostęp do klasy, metody lub zmiennej, która może być używana lokalnie lub w sekcji kodu, w której jest zdefiniowana. Wszystkie metody i zmienne, dla których nie zdefiniowano specyfikatora dostępu, przyjmują domyślny specyfikator dostępu „private”.

Chroniony

Ten specyfikator dostępu zapewnia dostęp do metody lub zmiennej, która ma być używana przez dowolne klasy wewnętrzne w obrębie definiującej klasy Apex.

Globalny

Ten specyfikator dostępu zapewnia dostęp do klasy, metody lub zmiennej, która ma być używana przez Apex zarówno w przestrzeni nazw, jak i poza nią. Dobrą praktyką jest nieużywanie słowa kluczowego global, chyba że jest to konieczne.

Słowa kluczowe w Apex

Z udostępnianiem

Jeśli klasa jest zdefiniowana za pomocą tego słowa kluczowego, egzekwowane są wszystkie reguły współdzielenia obowiązujące bieżącego użytkownika. Jeśli to słowo kluczowe jest nieobecne, kod jest wykonywany w kontekście systemowym.

Na przykład:

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

Bez dzielenia się

Jeśli klasa jest zdefiniowana za pomocą tego słowa kluczowego, wówczas reguły udostępniania mające zastosowanie do bieżącego użytkownika nie są egzekwowane.

Na przykład:

public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}

Statyczny

Zmienna lub metoda zdefiniowana za pomocą słowa kluczowego static jest inicjowana jednorazowo i kojarzona z klasą. Zmienne i metody statyczne można wywoływać bezpośrednio przez nazwę klasy, bez tworzenia jej instancji.

koniec

Stałej lub metody zdefiniowanej za pomocą słowa kluczowego final nie można zastąpić. Na przykład:

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

Jeśli spróbujesz zastąpić wartość tej zmiennej INT_CONST, otrzymasz wyjątek – System.FinalException: Zmienna końcowa została już zainicjowana.

Powrót

To słowo kluczowe zwraca wartość z metody. Na przykład:

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

Null

Definiuje stałą null, którą można przypisać do zmiennej. Na przykład:

Boolean b = null;

Wirtualny

Jeżeli klasa zostanie zdefiniowana za pomocą słowa kluczowego virtual, można ją rozszerzyć i zastąpić.

Abstrakcja

Jeśli klasa jest zdefiniowana za pomocą abstracSłowo kluczowe t musi zawierać co najmniej jedną metodę ze słowem kluczowym abstract, a metoda ta powinna mieć tylko podpis.

Na przykład:

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

Ciąg wierzchołkowy

Ciąg znaków to zbiór znaków bez limitu. Na przykład:

String name = 'Test';

Klasa String w Salesforce oferuje kilka wbudowanych metod. Poniżej znajduje się kilka często używanych metod:

skrócić (maxWidth)

Ta metoda skraca ciąg znaków do określonej długości i zwraca go, jeśli długość podanego ciągu znaków jest większa niż określona długość; w przeciwnym razie zwraca oryginalny ciąg znaków. Jeśli wartość zmiennej maxWidth jest mniejsza niż 4, metoda zgłasza wyjątek w czasie wykonywania – System.StringException: Minimalna szerokość skróconego ciągu znaków wynosi 4.

Na przykład:

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

skapitalizować()

Ta metoda konwertuje pierwszą literę ciągu na wielkość liter tytułu i zwraca ją.

Na przykład:

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

zawiera (podciąg)

Ta metoda zwraca wartość true, jeśli ciąg wywołujący metodę zawiera określony podciąg.

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

równa się (stringOrId)

Ta metoda zwraca wartość true, jeśli przekazany parametr nie jest nullem i reprezentuje tę samą binarną sekwencję znaków, co ciąg wywołujący metodę.

Podczas porównywania wartości identyfikatorów, ich długości mogą się różnić. Na przykład, jeśli ciąg reprezentujący 15-znakowy identyfikator zostanie porównany z obiektem reprezentującym 18-znakowy identyfikator, ta metoda nadal zwróci wartość true. Na przykład:

String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true

W powyższym przykładzie metoda equals porównuje 15-znakowy identyfikator obiektu z 18-znakowym identyfikatorem obiektu i jeśli oba identyfikatory reprezentują tę samą sekwencję binarną, zwraca wartość true.

Użyj tej metody, aby dokonać porównań uwzględniających wielkość liter.

escapeSingleQuotes(stringToEscape)

Ta metoda dodaje znak ucieczki (\) przed każdym pojedynczym cudzysłowem w ciągu i zwraca wynik. Zapobiega ona wstrzykiwaniu kodu SOQL podczas tworzenia dynamicznego zapytania SOQL. Gwarantuje, że wszystkie pojedyncze cudzysłowy są traktowane jako otaczające ciągi znaków, a nie polecenia bazy danych.

Na przykład:

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

usuń (podciąg)

Ta metoda usuwa wszystkie wystąpienia wskazanego podciągu z ciągu wywołującego metodę i zwraca wynikowy ciąg.

Na przykład:

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

podciąg (startIndex)

Ta metoda zwraca podciąg zaczynający się od znaku o indeksie startIndex i rozciągający się do końca ciągu.

Na przykład:

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

odwrócić()

Ta metoda odwraca kolejność wszystkich znaków w ciągu i zwraca je. Na przykład:

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

trym()

Ta metoda usuwa wszystkie początkowe i końcowe spacje z ciągu i zwraca go.

wartość(do konwersji)

Ta metoda zwraca reprezentację tekstową przekazanego obiektu.

Ciągi znaków, klasy i słowa kluczowe łączą się, gdy zaczynasz pakować logikę w jednostki wielokrotnego użytku. Właśnie do tego służą klasy Apex.

Klasa Apex

Klasa Apex to plan lub szablon, na podstawie którego tworzone są obiekty. Obiekt jest instancją klasy.

Istnieją trzy sposoby tworzenia klas Apex w Salesforce:

  • Konsola programisty
  • Visual Studio Code z pakietem rozszerzeń Salesforce
  • Strona szczegółów klasy Apex w konfiguracji

W Apexie można definiować klasę zewnętrzną, zwaną również klasą najwyższego poziomu, a także definiować klasy w obrębie klasy zewnętrznej, zwane klasami wewnętrznymi.

W deklaracji klasy zewnętrznej obowiązkowe jest użycie modyfikatora dostępu, takiego jak global lub public.

Nie jest konieczne użycie modyfikatora dostępu w deklaracji klas wewnętrznych.

Klasę Apex definiuje się za pomocą słowa kluczowego class, po którym następuje nazwa klasy.

Słowo kluczowe extends służy do rozszerzania istniejącej klasy w klasie Apex, a słowo kluczowe implements służy do implementacji interfejsu w klasie Apex.

Salesforce Apex nie obsługuje wielokrotnego dziedziczenia. Klasa Apex może rozszerzać tylko jedną istniejącą klasę Apex, ale może implementować wiele interfejsów.

Klasa Apex może zawierać konstruktor zdefiniowany przez użytkownika, a jeśli taki konstruktor jest niedostępny, używany jest konstruktor domyślny. Kod w konstruktorze jest wykonywany podczas tworzenia instancji klasy.

Składnia klasy Apex:

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

Słowo kluczowe „new” służy do tworzenia instancji klasy Apex. Poniżej znajduje się składnia tworzenia instancji klasy Apex:

myApexClass obj = new myApexClass();

Pobierający i ustawiający wierzchołek

Właściwość Apex jest podobna do zmiennej Apex. Getter i setter są niezbędne dla właściwości Apex. Mogą być używane do wykonywania kodu przed uzyskaniem dostępu do wartości właściwości lub jej zmianą. Kod w akcesorze get jest wykonywany po odczytaniu wartości właściwości. Kod w akcesorze set jest wykonywany po zmianie wartości właściwości. Każda właściwość posiadająca tylko akcesorium get jest uznawana za tylko do odczytu, każda właściwość posiadająca tylko akcesorium set jest uznawana za tylko do zapisu, a każda właściwość posiadająca zarówno akcesorium get, jak i set jest uznawana za odczyt i zapis. Składnia właściwości Apex:

public class myApexClass {
// Property declaration
	access_modifier return_type property_name {
	get {
			//code
		}
		set{
			//code
		}
	}
}

Tutaj access_modifier jest modyfikatorem dostępu do właściwości, return_type jest typem danych właściwości, a property_name jest nazwą właściwości.

Poniżej znajduje się przykład właściwości Apex posiadającej zarówno akcesory get, jak i set:

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

W tym przypadku nazwa właściwości to name, jest to właściwość publiczna i zwraca typ danych String.

Nie jest wymagane umieszczanie kodu w blokach „get” i „set”. Bloki te można pozostawić puste, aby zdefiniować właściwość automatyczną. Na przykład:

public double MyReadWriteProp{ get; set; }

Akcesory typu „get” i „set” można również definiować z własnymi modyfikatorami dostępu. Jeśli akcesor jest zdefiniowany z modyfikatorem, zastępuje on modyfikator dostępu do właściwości. Na przykład:

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

Klasy definiują logikę wielokrotnego użytku, którą można wywołać jawnie. Wyzwalacze, omówione poniżej, uruchamiają się automatycznie przy każdej zmianie rekordów.

Wyzwalacz wierzchołkowy

Wyzwalacze Apex umożliwiają uruchomienie niestandardowego polecenia Apex przed i po wykonaniu operacji DML.

Apex obsługuje następujące dwa typy wyzwalaczy:

Przed wyzwalaczami: Te wyzwalacze służą do sprawdzania poprawności i aktualizowania wartości pola przed zapisaniem rekordu w bazie danych.

Po wyzwalaczach: Te wyzwalacze służą do uzyskiwania dostępu do wartości pól (takich jak identyfikator rekordu i pole LastModifiedDate), które są ustawiane przez system po zatwierdzeniu rekordu w bazie danych. Wartości te mogą być używane do modyfikowania innych rekordów. Rekordy uruchamiane po zadziałaniu wyzwalaczy są tylko do odczytu.

Dobrą praktyką jest pisanie wyzwalaczy zbiorczych. Wyzwalacz zbiorczy może przetwarzać zarówno pojedynczy rekord, jak i wiele rekordów jednocześnie.

Składnia wyzwalacza Apex:

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

Tutaj TriggerName to nazwa wyzwalacza, ObjectName to nazwa obiektu, na którym zapisany jest wyzwalacz, a trigger_events to lista zdarzeń oddzielonych przecinkami.

Poniżej wymieniono zdarzenia obsługiwane przez wyzwalacze Apex: przed wstawieniem, przed aktualizacją, przed usunięciem, po wstawieniu, po aktualizacji, po usunięciu, po cofnięciu usunięcia.

W wyzwalaczu Apex nie można używać statycznych słów kluczowych. W wyzwalaczu Apex można używać wszystkich słów kluczowych odnoszących się do klas wewnętrznych.

Każdy wyzwalacz ma zdefiniowane zmienne niejawne, które zwracają kontekst czasu wykonania. Zmienne te są zdefiniowane w klasie System.Trigger i nazywane są zmiennymi kontekstowymi. Dwa poniższe zrzuty ekranu przedstawiają zmienne kontekstowe obsługiwane przez wyzwalacze Apex:

Zmienne kontekstowe wyzwalacza Apex

Zmienne kontekstowe wyzwalacza Apex (ciąg dalszy)

Poniżej przedstawiono zagadnienia dotyczące zmiennych kontekstowych w wyzwalaczach Apex:

  • Nie należy używać trigger.new i trigger.old w operacjach DML.
  • Trigger.new nie może zostać usunięty.
  • Trigger.new jest tylko do odczytu po wyzwalaczach.
  • Trigger.new można używać do zmiany wartości pól tego samego obiektu tylko przed wyzwalaczami.

Poniższe dwa zrzuty ekranu przedstawiają zagadnienia związane z konkretnymi działaniami w przypadku różnych zdarzeń wyzwalających:

Rozważania dotyczące zdarzeń wyzwalających Apex

Rozważania dotyczące zdarzeń wyzwalających Apex (ciąg dalszy)

Wyzwalacze obsługują logikę w czasie rzeczywistym, ale niektóre zadania są po prostu zbyt duże dla pojedynczej transakcji. Właśnie tutaj pojawia się Apex wsadowy.

Klasa wsadowa w Apex

Klasa wsadowa w Salesforce służy do przetwarzania dużej liczby rekordów, których normalna obsługa przekroczyłaby limity Apex Governor. Klasa wsadowa wykonuje kod asynchronicznie.

Oto zalety klasy wsadowej:

  • Klasa wsadowa przetwarza dane w fragmentach. Jeśli jeden fragment nie zostanie przetworzony prawidłowo, fragmenty przetworzone prawidłowo nie zostaną wycofane.
  • Każdy fragment danych w klasie wsadowej jest przetwarzany przy użyciu nowego zestawu limitów wykonawczych, co gwarantuje, że kod będzie wykonywany w ramach limitów wykonawczych.

Interfejs Database.Batchable musi być zaimplementowany przez klasę Apex, aby mógł być używany jako klasa wsadowa. Udostępnia on trzy metody, które muszą zostać zaimplementowane przez klasę wsadową:

1. start()

Ta metoda generuje zakres rekordów lub obiektów, które mają zostać przetworzone przez metodę interfejsu „execute”. Jest wywoływana tylko raz podczas wykonywania wsadu. Zwraca obiekt Database.QueryLocator lub obiekt iterowalny. Liczba rekordów, które można pobrać za pomocą zapytania SOQL z użyciem obiektu Database.QueryLocator, wynosi 50 milionów, ale w przypadku obiektu iterowalnego, całkowita liczba rekordów, które można pobrać za pomocą zapytania SOQL, wynosi tylko 50 000. Obiekt iterowalny służy do generowania złożonego zakresu dla klasy wsadowej.

Składnia metody start:

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

2. wykonaj()

Ta metoda służy do przetwarzania każdego fragmentu danych. Metoda execute jest wywoływana dla każdego fragmentu rekordów. Domyślny rozmiar partii do wykonania to 200 rekordów. Metoda execute przyjmuje dwa argumenty:

Odwołanie do obiektu Database.BatchableContext,

Lista obiektów sObject, takich jak Lista lub listę sparametryzowanych typów. Składnia metody execute:

global void execute(Database.BatchableContext bc, List<P> records){}

3. zakończ()

Metoda finish jest wywoływana jednokrotnie podczas wykonywania klasy wsadowej. Operacje postprocessingu mogą być wykonywane w metodzie finish. Na przykład: wysłanie e-maila z potwierdzeniem. Ta metoda jest wywoływana po przetworzeniu wszystkich wsadów. Składnia metody finish:

global void finish(Database.BatchableContext bc){}

Obiekt Database.BatchableContext

Każda metoda interfejsu Database.Batchable odwołuje się do obiektu Database.BatchableContext.

Ten obiekt służy do track postęp zadania wsadowego.

Poniżej przedstawiono metody instancji udostępniane przez BatchableContext:

  • getChildJobId(): Ta metoda zwraca identyfikator zadania wsadowego, które jest aktualnie przetwarzane.
  • getJobId(): Ta metoda zwraca identyfikator zadania wsadowego.

Poniżej przedstawiono składnię klasy wsadowej:

global class MyBatchClass implements Database.Batchable<sObject> {
	global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContext bc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}

Metoda Database.executeBatch

Metoda Database.executeBatch służy do wykonywania klasy wsadowej.

Ta metoda przyjmuje dwa parametry: instancję klasy partii do przetworzenia oraz opcjonalny parametr zakresu określający rozmiar partii. Jeśli nie zostanie on określony, używany jest domyślny rozmiar 200.

Składnia Database.executeBatch:

Database.executeBatch(myBatchObject, scope)

Wykonywanie klasy wsadowej o nazwie MyBatchClass:

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

Baza danych.Stanowa

Klasa wsadowa jest domyślnie bezstanowa. Za każdym razem, gdy wywołana jest metoda execute, otrzymywana jest nowa kopia obiektu, a wszystkie zmienne klasy są inicjowane.

Database.Stateful zaimplementowano w celu nadania klasie wsadowej cech stanowych.

Jeśli Twoja klasa wsadowa implementuje Baza danychInterfejs stanowy, wszystkie zmienne instancji zachowują swoje wartości, ale zmienne statyczne są resetowane pomiędzy transakcjami.

Asynchroniczny Apex Beyond Batch

Batch Apex to tylko jeden z kilku sposobów asynchronicznego uruchamiania kodu. Salesforce oferuje cztery opcje asynchroniczne, a wybór odpowiedniej zależy od ilości przetwarzanych danych oraz tego, czy zadania mają być łączone w łańcuchy, czy planowane.

  • Przyszłe metody: Oznaczone adnotacją @future, najlepiej sprawdzają się w przypadku prostych operacji typu „włącz i zapomnij”, takich jak wywołania zewnętrznych usług sieciowych.
  • Kolejkowany Apex: Implementuje interfejs Queueable, akceptuje złożone typy obiektów, zwraca identyfikator zadania i obsługuje łączenie jednego zadania z drugim.
  • Apex partii: Przetwarza bardzo duże ilości danych w blokach, jak opisano powyżej.
  • Zaplanowany szczyt: Implementuje interfejs Schedulable, dzięki czemu klasa jest uruchamiana o określonej porze, np. w przypadku nocnego czyszczenia.
Typ Najlepsze dla: Kluczowa zdolność
Przyszła metoda Proste objaśnienia Wystrzel i zapomnij
Kolejkowy Apex Przetwarzanie sekwencyjne Łańcuchowanie i monitorowanie zadań
Batch Apex Miliony rekordów Przetwarzanie fragmentaryczne
Zaplanowany wierzchołek Powtarzające się prace Czas oparty na cronie

Niezależnie od wybranego modelu realizacji transakcji, każda transakcja jest mierzona w oparciu o limity obowiązujące na platformie, wymienione poniżej.

Limity gubernatora Apex

Limity zarządcy Apex to limity egzekwowane przez silnik wykonawczy Apex, aby zapewnić, że żaden niekontrolowany kod i procesy Apex nie zmonopolizują współdzielonych zasobów i nie zakłócą przetwarzania innych użytkowników w środowisku wielodostępnym. Limity te są weryfikowane dla każdej transakcji Apex. Poniżej przedstawiono limity zarządcy zdefiniowane przez Salesforce dla każdej transakcji Apex:

OPIS Ograniczenia
Zapytania SOQL, które można wykonać w transakcji synchronicznej 100
Zapytania SOQL, które można wykonać w transakcji asynchronicznej 200
Rekordy, które można pobrać za pomocą zapytania SOQL 50,000
Rekordy, które można pobrać za pomocą Database.getQueryLocator 10,000
Zapytania SOSL, które można wykonać w transakcji Apex 20
Rekordy, które można pobrać za pomocą zapytania SOSL 2,000
Polecenia DML, które można wykonać w transakcji Apex 150
Rekordy, które można przetworzyć w wyniku instrukcji DML, Approval.process lub Database.emptyRecycleBin 10,000
Wywołania, które można wykonać w transakcji Apex 100
Łączny limit czasu dla wszystkich wywołań wykonywanych w ramach transakcji Apex 120 sekund
Limit zadań Apex, które można dodać do kolejki za pomocą System.enqueueJob 50
Limit czasu realizacji każdej transakcji Apex 10 minut
Limit znaków, które można użyć w klasie Apex i wyzwalaczu 1 milionów
Limit czasu procesora dla transakcji synchronicznej milisekund 10,000
Limit czasu procesora dla transakcji asynchronicznej milisekund 60,000
Całkowity rozmiar sterty 6 MB (synchronicznie) / 12 MB (asynchronicznie)

Jak napisać klasę testową w Apex

Salesforce wymaga, aby co najmniej 75% kodu Apex było objęte testami jednostkowymi przed wdrożeniem go w środowisku produkcyjnym, a każdy wyzwalacz musi mieć pewne pokrycie. Tworzenie klas testowych jest zatem podstawową umiejętnością Apex, a nie opcjonalnym dodatkiem.

Klasa testowa jest oznaczona adnotacją @isTest, a każda metoda testowa również jest oznaczona adnotacją @isTest. Metody testowe nie zatwierdzają danych w bazie danych i nie widzą większości istniejących danych organizacji, dlatego każdy test tworzy własne rekordy. Metody Test.startTest() i Test.stopTest() zapewniają testowanemu kodowi nowy zestaw limitów, a asercje weryfikują, czy logika działała zgodnie z oczekiwaniami.

Oto prosta klasa testowa dla logiki tworzenia kont:

@isTest
private class AccountHandlerTest {
    @isTest
    static void testCreateAccount() {
        Account acc = new Account(Name = 'Test Account');
        Test.startTest();
        insert acc;
        Test.stopTest();
        Account result = [SELECT Id, Name FROM Account WHERE Id = :acc.Id];
        System.assertEquals('Test Account', result.Name);
    }
}

Podczas pisania testów należy przestrzegać następujących wytycznych:

  • Użyj metody @testSetup, aby utworzyć współdzielone dane testowe raz dla wszystkich metod testowych w klasie.
  • Przetestuj zachowanie grupy, wstawiając 200 rekordów, a nie tylko jeden.
  • Omów scenariusze pozytywne, negatywne i te z ograniczeniami użytkownika.
  • Zawsze dodawaj sensowne instrukcje System.assert; pokrycie bez asercji niczego nie dowodzi.

Najlepsze praktyki Apex

Początkujący często piszą Apex, który działa dla jednego rekordu, ale nie sprawdza się w rzeczywistych operacjach zbiorczych. Poniższe praktyki pozwalają utrzymać kod w granicach wyznaczonych przez regulatora i ułatwiają jego konserwację:

  • Zwiększ objętość wszystkiego: Napisz logikę, która obsługuje zbiory rekordów, ponieważ wyzwalacze mogą odbierać do 200 rekordów w jednej partii.
  • Unikaj pętli SOQL i DML: Zapytanie przed pętlą, zebranie zmian na liście i wykonanie jednego polecenia DML po pętli.
  • Jeden wyzwalacz na obiekt: Utrzymuj wyzwalacze wolne od logiki i deleguj pracę do klas obsługi, dzięki czemu kolejność wykonywania będzie przewidywalna.
  • Użyj z udostępnianiem: Wymuś zabezpieczenia na poziomie rekordów, chyba że istnieje udokumentowany powód, aby uruchomić je w kontekście systemowym.
  • Unikaj sztywnego kodowania identyfikatorów: Identyfikatory rekordów różnią się w środowiskach testowych i produkcyjnych, dlatego należy je wyszukać lub użyć niestandardowych metadanych.
  • Monitoruj limity w kodzie: Metody klasy Limits, takie jak Limits.getQueries(), umożliwiają sprawdzanie zużycia zasobów w czasie wykonywania.

💡 Wskazówka: Przed wdrożeniem uruchom kod na 200 rekordach w piaskownicy. Większość błędów limitów pojawia się tylko przy dużej liczbie rekordów, a ich wczesne wykrycie jest znacznie tańsze niż debugowanie w środowisku produkcyjnym.

FAQ

Nie. Apex pożycza Java-podobna składnia, ale nie uwzględnia wielkości liter, działa tylko na platformie Salesforce Lightning, integruje SOQL bezpośrednio z językiem i podlega ograniczeniom na transakcję, które Java nie ma.

Zarejestruj się w bezpłatnej wersji Salesforce Developer Edition, która obejmuje Konsolę programisty, i skorzystaj z ćwiczeń praktycznych Początek, oficjalna platforma edukacyjna firmy Salesforce.

Visualforce to język znaczników do tworzenia stron interfejsu użytkownika, natomiast Apex to język po stronie serwera, który dostarcza logikę dla nich. Strony Visualforce często wywołują klasy kontrolerów Apex w celu wykonywania zapytań i aktualizacji danych.

Tak. Agentforce dla programistów, asystent AI od Salesforce dla Visual Studio Code, generuje i wyjaśnia Apex na podstawie komunikatów w języku naturalnym. Zawsze sprawdzaj i testuj kod wygenerowany przez sztuczną inteligencję pod kątem limitów przed wdrożeniem.

Klasy Apex oznaczone adnotacją @InvocableMethod można udostępnić jako akcje niestandardowe, umożliwiając botom Einstein i agentom Agentforce wywoływanie logiki biznesowej, podczas gdy Apex może również wywoływać szablony monitów Einstein i modele AI za pośrednictwem interfejsów API platformy.

Podsumuj ten post następująco: