Vodič za Salesforce Apex za početnike

⚡ Pametni sažetak

Apex programiranje pruža Salesforce programerima objektno orijentirani, snažno tipizirani jezik za dodavanje prilagođene poslovne logike u CRM. Pokreće klase, okidače i batch poslove, dok ograničenja regulatora održavaju stabilnost dijeljene platforme s više zakupaca.

  • 🧱 Foundation: Apex je jezik koji ne razlikuje velika i mala slova. Java-slična sintaksa koja se izvorno izvodi na Salesforce Lightning platformi.
  • 🗃️ Pristup podacima: SOQL upiti i DML naredbe omogućuju vašem kodu da čita i piše sObject zapise izravno u Salesforce bazi podataka.
  • 🛠️ provedba: Klase, svojstva i okidači pridaju prilagođenu logiku umetanjima, ažuriranjima, brisanjima i drugim sistemskim događajima zapisa.
  • ???? skala: Batch Apex i druge asinhrone opcije obrađuju milijune zapisa u blokovima bez kršenja ograničenja platforme.
  • 🚦 Guvernerove granice: Ograničenja po transakciji, kao što je 100 sinkronih SOQL upita i 150 DML naredbi, štite dijeljene resurse.
  • Kvaliteta: Jedinični testovi moraju pokriti najmanje 75 posto Apex koda prije implementacije u produkciju.

Pregled programiranja u APEX Salesforceu

Što je Apex u Salesforceu?

Vrh je objektno orijentirani i snažno tipizirani programski jezik koji je razvio Salesforce za izgradnju SaaS (Software as a Service) i CRM (Customer Relationship Management) aplikacija. Apex pomaže programerima u stvaranju SaaS aplikacija trećih strana i dodavanju poslovne logike sistemskim događajima pružajući podršku za pozadinske baze podataka i klijentsko-poslužiteljska sučelja.

Apex pomaže programerima da dodaju poslovnu logiku sistemskim događajima poput klikova na gumbe, ažuriranja povezanih zapisa i Visualforce stranica. Apex ima sintaksu sličnu Java. Registrirajte se za Salesforce kako bi naučili kako CRM funkcionira.

Značajke programskog jezika Apex

Evo važnih značajki Salesforce Apexa:

  • Apex je jezik koji ne razlikuje velika i mala slova.
  • Pomoću Apexa možete izvoditi DML operacije poput INSERT, UPDATE, UPSERT i DELETE na sObject zapisima.
  • Zapise sObject možete pretraživati ​​pomoću SOQL-a (Salesforce Object Query Language) i SOSL-a (Salesforce Object Search Language) u Apexu.
  • Omogućuje vam stvaranje a jedinični test i izvršite ga kako biste provjerili pokrivenost koda i učinkovitost koda u Apexu.
  • Apex se izvršava u okruženju s više stanara i Salesforce ima definirana ograničenja regulatora koja sprječavaju korisnika da monopolizira dijeljene resurse. Svaki kod koji prijeđe ograničenje regulatora Salesforcea ne uspijeva i pojavljuje se greška.
  • Objekt Salesforce može se koristiti kao tip podataka u Apexu. Na primjer:
    Account acc = new Account();

    Ovdje je Account standardni Salesforce objekt.

  • Apex se automatski nadograđuje sa svakim Salesforce izdanjem.

Kada bi programer trebao odabrati Apex?

Apex kod treba pisati samo ako je poslovni scenarij previše složen za implementaciju korištenjem unaprijed izgrađene funkcionalnosti "pokaži i klikni" koju pruža Salesforce.

Slijede neki scenariji u kojima trebate napisati Apex kod:

  • Za izradu web usluga koje integriraju Salesforce s drugim aplikacijama.
  • Za implementaciju prilagođene validacije na sObjects.
  • Za izvršavanje prilagođene Apex logike kada se izvodi DML operacija.
  • Za implementaciju funkcionalnosti koje se ne mogu izgraditi postojećim deklarativnim alatima za automatizaciju kao što je Flow.
  • Postaviti usluge e -pošte koji obrađuju sadržaj, zaglavlja i privitke dolazne e-pošte.

Nakon što znate kada je Apex pravi izbor, sljedeći korak je razumijevanje što se događa s vašim kodom nakon što ga spremite.

Radna struktura Apexa

Slijedeći je tijek radnji za Apex kod:

  • Radnja razvojnog programera: Kada programer spremi kod na platformu, sav Apex kod se kompilira u skup instrukcija koje Apex runtime interpreter može razumjeti, a te se instrukcije zatim spremaju kao metapodaci na platformi.
  • Radnja krajnjeg korisnika: Kada korisnički događaj izvrši Apex kod, poslužitelj platforme dohvaća kompilirane instrukcije iz metapodataka i pokreće ih kroz Apex interpreter prije vraćanja rezultata.

Donji dijagram prikazuje kako radnje programera i krajnjeg korisnika komuniciraju s aplikacijskim poslužiteljem Lightning Platforme:

Radna struktura Apexa

Razvojno okruženje Apex

Apex kod može se razvijati ili u sandboxu ili u organizaciji Salesforcea Developer Edition.

Najbolja je praksa razviti kod u sandbox okruženju, a zatim ga implementirati u produkcijsko okruženje, kao što je prikazano u nastavku:

Razvojno okruženje Apex

Alati za razvoj Apex koda: Slijede tri alata dostupna za razvoj Apex koda u svim izdanjima Salesforcea:

  • Konzola za razvojne programere
  • Visual Studio Code s paketom Salesforce Extension Pack (ovo zamjenjuje umirovljeno Force.com IDE)
  • Code uređivač u korisničkom sučelju Salesforce Setup

Nakon što je vaše okruženje spremno, pogledajmo temeljne elemente samog jezika, počevši s tipovima podataka.

Vrste podataka u Apexu

Apex podržava sljedeće tipove podataka:

primitivan

Cijeli broj, Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID i Boolean smatraju se primitivnim tipovima podataka. Svi primitivni tipovi podataka prenose se po vrijednosti, a ne po referenci.

Kolekcije

U Apexu su dostupne tri vrste kolekcija:

  • Popis: To je uređena kolekcija primitiva, sObjekata, kolekcija ili Apex objekata temeljena na indeksima.
  • Set: Neuređena kolekcija jedinstvenih elemenata koja ne sadrži duplikate.
  • Karta: To je kolekcija jedinstvenih ključeva koji se mapiraju na pojedinačne vrijednosti, koje mogu biti primitivi, sObjects, kolekcije ili Apex objekti.

sObject

Ovo je posebna vrsta podataka u Salesforceu. Slično je stolu u SQL i sadrži polja koja su slična stupcima u SQL-u.

Enum

Enum je abstract tip podataka koji pohranjuje jednu vrijednost konačnog skupa određenih identifikatora.

Klase, objekti i sučelja

Korisnički definirane Apex klase i sučelja također se mogu koristiti kao tipovi podataka. Objekt se odnosi na instancu bilo kojeg tipa podataka koji je podržan u Apexu.

Apex sintaksa

Izjava varijable

Budući da je Apex jezik snažnog tipa, obavezno je deklarirati varijablu s tipom podataka u Apexu.

Na primjer:

Contact con = new Contact();

Ovdje je varijabla con deklarirana s tipom podataka Contact.

SOQL upit

SOQL je kratica za Salesforce Object Query Language. SOQL se koristi za dohvaćanje sObject zapisa iz Salesforce baze podataka. Na primjer:

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

Gornji upit dohvaća zapis računa iz baze podataka Salesforcea.

Naredba petlje

Za iteraciju kroz zapise u popisu koristi se naredba petlje. Broj iteracija jednak je broju zapisa u popisu. Na primjer:

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

U gornjem isječku koda, listOfAccounts je varijabla tipa podataka List.

Izjava o kontroli toka

Naredba za kontrolu toka korisna je kada želite izvršiti neke retke koda na temelju određenih uvjeta.

Na primjer:

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
}

Gornji isječak koda ispituje zapise računa iz baze podataka i provjerava veličinu popisa.

DML izjava

DML je kratica za Data Manipulation Language (Jezik za manipulaciju podacima). DML naredbe se koriste za manipuliranje podacima u Salesforce bazi podataka. Na primjer:

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

Apex specifikacije pristupa

Slijede specifikatori pristupa koje Apex podržava:

javnost

Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koju će Apex koristiti unutar imenskog prostora.

Privatni

Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koja se koristi lokalno ili unutar dijela koda gdje je definirana. Sve metode i varijable koje nemaju definirani specifikator pristupa preuzimaju zadani specifikator pristupa private.

zaštićen

Ovaj specifikator pristupa daje pristup metodi ili varijabli koju će koristiti bilo koja unutarnja klasa unutar definirajuće Apex klase.

Globalan

Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koju Apex koristi unutar imenskog prostora, kao i izvan njega. Najbolja je praksa ne koristiti ključnu riječ global osim ako nije potrebno.

Ključne riječi u Apexu

Uz dijeljenje

Ako je klasa definirana ovom ključnom riječi, tada se provode sva pravila dijeljenja koja se primjenjuju na trenutnog korisnika. Ako ova ključna riječ nije prisutna, kôd se izvršava u kontekstu sustava.

Na primjer:

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

Bez dijeljenja

Ako je klasa definirana ovom ključnom riječi, tada se pravila dijeljenja koja se primjenjuju na trenutnog korisnika ne primjenjuju.

Na primjer:

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

statički

Varijabla ili metoda definirana ključnom riječi static inicijalizira se jednom i povezuje s klasom. Statičke varijable i metode mogu se pozvati izravno imenom klase bez stvaranja instance klase.

Final

Konstanta ili metoda definirana ključnom riječi final ne može se nadjačati. Na primjer:

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

Ako pokušate poništiti vrijednost ove varijable INT_CONST, dobit ćete iznimku – System.FinalException: Konačna varijabla je već inicijalizirana.

Povratak

Ova ključna riječ vraća vrijednost iz metode. Na primjer:

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

nula

Definira null konstantu i može se dodijeliti varijabli. Na primjer:

Boolean b = null;

virtualan

Ako je klasa definirana ključnom riječi virtual, može se proširiti i nadjačati.

Kormilartract

Ako je klasa definirana s abstract ključna riječ, mora sadržavati barem jednu metodu s ključnom riječi abstract, i ta metoda bi trebala imati samo potpis.

Na primjer:

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

Apex žica

Niz znakova je skup znakova bez ograničenja broja znakova. Na primjer:

String name = 'Test';

Klasa String u Salesforceu nudi nekoliko ugrađenih metoda. Slijede neke od često korištenih metoda:

skrati (maxWidth)

Ova metoda skraćuje niz na zadanu duljinu i vraća ga ako je duljina zadanog niza dulja od zadane duljine; u suprotnom vraća izvorni niz. Ako je vrijednost varijable maxWidth manja od 4, ova metoda izbacuje iznimku tijekom izvođenja – System.StringException: Minimalna širina kratice je 4.

Na primjer:

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

kapitalizirati ()

Ova metoda pretvara prvo slovo niza u velika i mala slova i vraća ga.

Na primjer:

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

sadrži (podniz)

Ova metoda vraća vrijednost true ako niz znakova koji poziva metodu sadrži navedeni podniz.

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

jednako (stringOrId)

Ova metoda vraća vrijednost true ako proslijeđeni parametar nije null i predstavlja isti binarni niz znakova kao i niz znakova koji poziva metodu.

Prilikom usporedbe vrijednosti ID-ova, duljine ID-ova možda neće biti jednake. Na primjer, ako se niz koji predstavlja ID od 15 znakova uspoređuje s objektom koji predstavlja ID od 18 znakova, ova metoda i dalje vraća vrijednost true. Na primjer:

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

U gornjem primjeru, metoda equals uspoređuje ID objekta od 15 znakova s ​​ID-om objekta od 18 znakova, i ako oba ID-a predstavljaju isti binarni niz, vraća vrijednost true.

Koristite ovu metodu za usporedbu koja razlikuje velika i mala slova.

escapeSingleQuotes(stringToEscape)

Ova metoda dodaje znak za izlaz (\) prije bilo kojeg jednostrukog navodnika u nizu i vraća rezultat. Ova metoda sprječava SOQL injekciju prilikom stvaranja dinamičkog SOQL upita. Osigurava da se svi jednostruki navodnici tretiraju kao zatvoreni nizovi, a ne kao naredbe baze podataka.

Na primjer:

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

ukloniti (podniz)

Ova metoda uklanja sva pojavljivanja spomenutog podniza iz niza koji poziva metodu i vraća rezultirajući niz.

Na primjer:

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

podniz(početniindeks)

Ova metoda vraća podniz koji počinje od znaka na startIndex i proteže se do kraja niza.

Na primjer:

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

obrnuti ()

Ova metoda invertira sve znakove niza i vraća ga. Na primjer:

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

obloge ()

Ova metoda uklanja sve početne i završne razmake iz niza i vraća ga.

valueOf(toConvert)

Ova metoda vraća niz znakova predanog objekta.

Nizovi znakova, klase i ključne riječi spajaju se kada počnete pakirati logiku u jedinice za višekratnu upotrebu, što je upravo ono čemu služe Apex klase.

Apex klasa

Apex klasa je nacrt ili predložak iz kojeg se stvaraju objekti. Objekt je instanca klase.

Postoje tri načina za stvaranje Apex klasa u Salesforceu:

  • Konzola za razvojne programere
  • Visual Studio Code s paketom proširenja Salesforce
  • Stranica s detaljima Apex klase u postavkama

U Apexu možete definirati vanjsku klasu, koja se naziva i klasa najviše razine, a možete definirati i klase unutar vanjske klase, koje se nazivaju unutarnje klase.

Obavezno je koristiti modifikator pristupa poput global ili public u deklaraciji vanjske klase.

Nije potrebno koristiti modifikator pristupa u deklaraciji unutarnjih klasa.

Apex klasa se definira pomoću ključne riječi class nakon koje slijedi naziv klase.

Ključna riječ extends koristi se za proširenje postojeće klase u Apex klasi, a ključna riječ implements koristi se za implementaciju sučelja u Apex klasi.

Salesforce Apex ne podržava višestruko nasljeđivanje; Apex klasa može proširiti samo jednu postojeću Apex klasu, ali može implementirati više sučelja.

Apex klasa može sadržavati korisnički definirani konstruktor, a ako korisnički definirani konstruktor nije dostupan, koristi se zadani konstruktor. Kod u konstruktoru izvršava se kada se stvori instanca klase.

Sintaksa Apex klase:

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

Ključna riječ new koristi se za stvaranje instance Apex klase. U nastavku je sintaksa za stvaranje instance Apex klase:

myApexClass obj = new myApexClass();

Apex Getter i Setter

Apex svojstvo slično je Apex varijabli. Za Apex svojstvo potrebni su getter i setter. Mogu se koristiti za izvršavanje koda prije nego što se pristupi vrijednosti svojstva ili je promijeni. Kod u get pristupniku izvršava se kada se pročita vrijednost svojstva. Kod u set pristupniku izvršava se kada se promijeni vrijednost svojstva. Bilo koje svojstvo koje ima samo get pristupnik smatra se samo za čitanje, bilo koje svojstvo koje ima samo set pristupnik smatra se samo za pisanje, a bilo koje svojstvo koje ima i get i set pristupnike smatra se čitanjem i pisanjem. Sintaksa Apex svojstva:

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

Ovdje je access_modifier modifikator pristupa svojstvu, return_type je tip podataka svojstva, a property_name je naziv svojstva.

U nastavku je primjer Apex svojstva koje ima i get i set pristupnike:

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

Ovdje je naziv svojstva name, javno je svojstvo i vraća tip podataka String.

Nije obavezno imati kod u blokovima get i set. Ovi blokovi mogu ostati prazni kako bi se definiralo automatsko svojstvo. Na primjer:

public double MyReadWriteProp{ get; set; }

Pristupnici Get i Set također se mogu definirati s vlastitim modifikatorima pristupa. Ako je pristupnik definiran s modifikatorom, on nadjačava modifikator pristupa svojstva. Na primjer:

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

Klase definiraju logiku za višekratnu upotrebu koju pozivate eksplicitno. Okidači, o kojima će biti riječi u nastavku, pokreću se automatski kad god se zapisi promijene.

Apex okidač

Apex okidači vam omogućuju izvršavanje prilagođenog Apexa prije i nakon izvođenja DML operacije.

Apex podržava sljedeće dvije vrste okidača:

Prije okidača: Ovi okidači se koriste za provjeru valjanosti i ažuriranje vrijednosti polja prije nego što se zapis spremi u bazu podataka.

Nakon okidača: Ovi okidači se koriste za pristup vrijednostima polja (kao što su ID zapisa i polje LastModifiedDate) koje sustav postavlja nakon što je zapis poslan u bazu podataka. Ove vrijednosti polja mogu se koristiti za izmjenu drugih zapisa. Zapisi koji se aktiviraju nakon okidača samo su za čitanje.

Najbolja je praksa pisati skupne okidače. Skupni okidač može obraditi jedan zapis kao i više zapisa istovremeno.

Sintaksa Apex okidača:

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

Ovdje je TriggerName naziv okidača, ObjectName naziv objekta na kojem je okidač zapisan, a trigger_events je popis događaja odvojen zarezima.

Slijede događaji koje podržavaju Apex okidači: prije umetanja, prije ažuriranja, prije brisanja, nakon umetanja, nakon ažuriranja, nakon brisanja, nakon poništavanja brisanja.

Statičke ključne riječi ne mogu se koristiti u Apex okidaču. Sve ključne riječi primjenjive na unutarnje klase mogu se koristiti u Apex okidaču.

Svaki okidač definira implicitne varijable koje vraćaju kontekst izvođenja. Ove varijable definirane su u klasi System.Trigger i nazivaju se kontekstne varijable. Dvije snimke zaslona u nastavku navode kontekstne varijable koje podržavaju Apex okidači:

Varijable konteksta Apex okidača

Varijable konteksta Apex okidača (nastavak)

U nastavku su navedena razmatranja za kontekstualne varijable u Apex okidačima:

  • Ne koristite trigger.new i trigger.old u DML operacijama.
  • Trigger.new se ne može izbrisati.
  • Trigger.new je samo za čitanje u after triggerima.
  • Trigger.new se može koristiti za promjenu vrijednosti polja na istom objektu samo u prethodnim okidačima.

Dvije snimke zaslona u nastavku navode razmatranja o specifičnim radnjama u različitim okidačkim događajima:

Razmatranja događaja Apex Triggera

Razmatranja o događajima apex triggera (nastavak)

Okidači obrađuju logiku u stvarnom vremenu, ali neki poslovi su jednostavno preveliki za jednu transakciju. Tu nastupa batch Apex.

Skupna klasa u Apexu

Klasa batch u Salesforceu koristi se za obradu velikog broja zapisa koji bi premašili ograničenja Apex governora ako bi se normalno obradili. Klasa batch izvršava kod asinkrono.

Slijede prednosti batch klase:

  • Batch klasa obrađuje podatke u dijelovima, i ako se jedan dio ne uspije uspješno obraditi, uspješno obrađeni dijelovi se ne vraćaju unatrag.
  • Svaki blok podataka u batch klasi obrađuje se s novim skupom ograničenja regulatora, što osigurava da se kod izvršava unutar ograničenja izvršavanja regulatora.

Sučelje Database.Batchable mora biti implementirano od strane Apex klase da bi se koristilo kao batch klasa. Pruža tri metode koje batch klasa mora implementirati:

1. početak()

Ova metoda generira opseg zapisa ili objekata koji će se obraditi metodom sučelja execute. Poziva se samo jednom tijekom izvršavanja batch naredbe. Ova metoda vraća ili objekt Database.QueryLocator ili Iterable. Broj zapisa koji se mogu dohvatiti SOQL upitom pomoću objekta Database.QueryLocator je 50 milijuna, ali korištenjem Iterable-a, ukupan broj zapisa koji se mogu dohvatiti SOQL upitom je samo 50 000. Iterable se koristi za generiranje složenog opsega za klasu batch.

Sintaksa metode start:

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

2. izvrši()

Ova se metoda koristi za obradu svakog dijela podataka. Metoda execute poziva se za svaki dio zapisa. Zadana veličina serije za izvršavanje je 200 zapisa. Metoda execute prima dva argumenta:

Referenca na objekt Database.BatchableContext,

Popis sObjekata, kao što je Lista ili popis parametriziranih tipova. Sintaksa metode execute:

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

3. završi()

Metoda finish poziva se jednom tijekom izvršavanja klase batch. U metodi finish mogu se izvršiti operacije naknadne obrade. Na primjer: slanje e-pošte s potvrdom. Ova metoda poziva se kada se obrade sve serije. Sintaksa metode finish:

global void finish(Database.BatchableContext bc){}

Objekt Database.BatchableContext

Svaka metoda sučelja Database.Batchable ima referencu na objekt Database.BatchableContext.

Ovaj objekt se koristi za track napredak serijskog posla.

Slijede metode instance koje pruža BatchableContext:

  • getChildJobId(): Ova metoda vraća ID batch zadatka koji se trenutno obrađuje.
  • getJobId(): Ova metoda vraća ID skupnog posla.

Ispod je sintaksa batch klase:

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

Database.executeBatch Metoda

Metoda Database.executeBatch koristi se za izvršavanje batch klase.

Ova metoda uzima dva parametra: instancu klase serije koja se obrađuje i opcionalni parametar opsega za određivanje veličine serije. Ako nije naveden, koristi se zadana veličina od 200.

Sintaksa Database.executeBatch:

Database.executeBatch(myBatchObject, scope)

Izvršavanje batch klase pod nazivom MyBatchClass:

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

Database.Stateful

Klasa batch je prema zadanim postavkama bez stanja. Svaki put kada se pozove metoda execute, prima se nova kopija objekta i inicijaliziraju se sve varijable klase.

Database.Stateful je implementiran kako bi se klasa batch učinila stateful.

Ako vaša batch klasa implementira Baza podataka.Stateful sučelje, sve varijable instance zadržavaju svoje vrijednosti, ali statičke varijable se resetiraju između transakcija.

Asinkroni Apex Beyond Batch

Batch Apex je samo jedan od nekoliko načina za asinkrono izvršavanje koda. Salesforce nudi četiri asinkrone opcije, a odabir prave ovisi o tome koliko podataka obrađujete i treba li poslove povezati u lanac ili zakazati.

  • Buduće metode: Označeni s @future, oni su najbolji za jednostavne operacije tipa "ispali i zaboravi", poput pozivanja vanjskih web servisa.
  • Apex koji se može staviti u red čekanja: Implementira sučelje Queueable, prihvaća složene tipove objekata, vraća ID posla i podržava ulančavanje jednog posla s drugim.
  • Vrh serije: Obrađuje vrlo velike količine podataka u blokovima, kao što je gore opisano.
  • Planirani Apex: Implementira Schedulable sučelje tako da se klasa pokreće u određeno vrijeme, kao što je noćni posao čišćenja.
Tip Najbolje za Ključna sposobnost
Buduća metoda Jednostavni oblačići Pucaj i zaboravi
Apex koji se može staviti u red čekanja Sekvencijalna obrada Ulančavanje i praćenje poslova
Batch Apex Milijuni zapisa Obrada po blokovima
Planirani Apex Ponavljajući poslovi Vremensko određivanje temeljeno na cronu

Bez obzira na odabrani model izvršenja, svaka se transakcija i dalje mjeri u odnosu na ograničenja regulatora za cijelu platformu navedena u nastavku.

Apex Guverner Limits

Ograničenja Apex regulatora su ograničenja koja provodi Apex runtime engine kako bi se osiguralo da bilo koji nekontrolirani Apex kod i procesi ne monopoliziraju dijeljene resurse i ne ometaju obradu drugih korisnika u okruženju s više zakupaca. Ta se ograničenja provjeravaju za svaku Apex transakciju. Slijede ograničenja regulatora koja je Salesforce definirao za svaku Apex transakciju:

Description Ograničiti
SOQL upiti koji se mogu izvršiti u sinkronoj transakciji 100
SOQL upiti koji se mogu izvršiti u asinhronoj transakciji 200
Zapisi koji se mogu dohvatiti pomoću SOQL upita 50,000
Zapisi koje može dohvatiti Database.getQueryLocator 10,000
SOSL upiti koji se mogu izvršiti u Apex transakciji 20
Zapisi koji se mogu dohvatiti pomoću SOSL upita 2,000
DML naredbe koje se mogu izvršiti u Apex transakciji 150
Zapisi koji se mogu obraditi kao rezultat DML izjave, Approval.process ili database.emptyRecycleBin 10,000
Pozivi koji se mogu izvršiti u Apex transakciji 100
Kumulativno ograničenje vremenskog ograničenja za sve pozive koji se izvršavaju u Apex transakciji 120 sekundi
Ograničenje Apex poslova koji se mogu dodati u red čekanja pomoću System.enqueueJob 50
Vremensko ograničenje izvršenja za svaku Apex transakciju 10 minuta
Ograničenje znakova koji se mogu koristiti u Apex klasi i okidaču 1 milijuna
Vremensko ograničenje CPU-a za sinkronu transakciju 10,000 milisekundi
Vremensko ograničenje CPU-a za asinhronu transakciju 60,000 milisekundi
Ukupna veličina hrpe 6 MB (sinkrono) / 12 MB (asinkrono)

Kako napisati testnu klasu u Apexu

Salesforce zahtijeva da barem 75 posto vašeg Apex koda bude pokriveno jediničnim testovima prije nego što ga možete implementirati u produkciju, a svaki okidač mora imati određenu pokrivenost. Pisanje testnih klasa stoga je ključna Apex vještina, a ne opcionalni dodatak.

Testna klasa je označena s @isTest, a svaka testna metoda je također označena s @isTest. Testne metode ne pohranjuju podatke u bazu podataka i ne vide većinu postojećih organizacijskih podataka, pa svaki test stvara vlastite zapise. Metode Test.startTest() i Test.stopTest() daju kodu koji se testira novi skup ograničenja regulatora, a tvrdnje provjeravaju je li se logika ponašala kako se očekivalo.

Evo jednostavne testne klase za logiku kreiranja računa:

@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);
    }
}

Prilikom pisanja testova slijedite ove smjernice:

  • Pomoću metode @testSetup možete stvoriti zajedničke testne podatke jednom za sve testne metode u klasi.
  • Testirajte ponašanje skupnog unosa umetanjem 200 zapisa, ne samo jednog.
  • Obuhvatite pozitivne, negativne i scenarije s ograničenim korisnicima.
  • Uvijek uključite smislene System.assert izjave; pokrivenost bez tvrdnji ne dokazuje ništa.

Najbolje prakse Apexa

Početnici često pišu Apex koji radi za jedan zapis, ali ne uspijeva u stvarnim skupnim operacijama. Sljedeće prakse održavaju vaš kod unutar ograničenja regulatora i olakšavaju održavanje:

  • Grupno pretvori sve: Napišite logiku koja obrađuje kolekcije zapisa, jer okidači mogu primiti do 200 zapisa u jednoj seriji.
  • Izostavite SOQL i DML iz petlji: Upit prije petlje, prikupi promjene u listi i izvrši jednu DML naredbu nakon petlje.
  • Jedan okidač po objektu: Okidače neka budu bez logike i delegirajte posao klasama rukovatelja, što redoslijed izvršavanja čini predvidljivim.
  • Koristi se s dijeljenjem: Provedite sigurnost na razini zapisa osim ako ne postoji dokumentirani razlog za izvođenje u kontekstu sustava.
  • Izbjegavajte fiksno kodiranje ID-ova: ID-ovi zapisa razlikuju se između sandbox okruženja i produkcije, stoga ih pretražite ili umjesto toga koristite prilagođene metapodatke.
  • Pratite ograničenja u kodu: Metode klase Limits, kao što je Limits.getQueries(), omogućuju vam provjeru potrošnje resursa tijekom izvođenja.

💡 Savjet: Pokrenite svoj kod na 200 zapisa u sandboxu prije implementacije. Većina kvarova ograničenja regulatora pojavljuje se samo pri velikim količinama podataka, a njihovo rano otkrivanje je daleko jeftinije od otklanjanja pogrešaka u produkciji.

Pitanja i odgovori

Ne. Apex posuđuje Javasintaksa slična -, ali ne razlikuje velika i mala slova, radi samo na Salesforce Lightning platformi, integrira SOQL izravno u jezik i regulirana je ograničenjima po transakciji koja Java nema.

Prijavite se za besplatnu organizaciju Salesforce Developer Edition, koja uključuje Developer Console, i slijedite praktične vježbe na trag glava, službena platforma za učenje tvrtke Salesforce.

Visualforce je jezik za označavanje za izradu stranica korisničkog sučelja, dok je Apex poslužiteljski jezik koji pruža logiku koja stoji iza njih. Visualforce stranice često pozivaju Apex kontrolerske klase za upite i ažuriranje podataka.

Da. Agentforce za razvojne programere, AI asistent iz Salesforcea za Visual Studio Code, generira i objašnjava Apex iz upita na prirodnom jeziku. Uvijek pregledajte i testirajte kod generiran umjetnom inteligencijom u odnosu na ograničenja regulatora prije implementacije.

Apex klase označene anotacijom @InvocableMethod mogu se izložiti kao prilagođene akcije, omogućujući Einstein botovima i Agentforce agentima pozivanje vaše poslovne logike, dok Apex također može pozivati ​​Einsteinove predloške promptova i AI modele putem platformskih API-ja.

Sažmite ovu objavu uz: