Salesforce Apex-vejledning for begyndere
โก Smart opsummering
Apex-programmering giver Salesforce-udviklere et objektorienteret, stรฆrkt typebaseret sprog til at tilfรธje brugerdefineret forretningslogik til CRM'et. Det driver klasser, triggere og batchjob, mens Governor-grรฆnser holder den delte multi-tenant-platform stabil.

Hvad er Apex i Salesforce?
Apex er et objektorienteret og stรฆrkt typebaseret programmeringssprog udviklet af Salesforce til at bygge Software as a Service (SaaS) og Customer Relationship Management (CRM) applikationer. Apex hjรฆlper udviklere med at oprette tredjeparts SaaS-applikationer og tilfรธje forretningslogik til systemhรฆndelser ved at tilbyde backend-databasesupport og klient-server-grรฆnseflader.
Apex hjรฆlper udviklere med at tilfรธje forretningslogik til systemhรฆndelser som knapklik, relaterede postopdateringer og Visualforce-sider. Apex har en syntaks, der ligner Java. Tilmeld dig Salesforce for at lรฆre, hvordan CRM fungerer.
Funktioner i Apex-programmeringssproget
Her er de vigtige funktioner i Salesforce Apex:
- Apex er et sprog, der ikke skelner mellem store og smรฅ bogstaver.
- Du kan udfรธre DML-operationer som INSERT, UPDATE, UPSERT og DELETE pรฅ sObject-poster ved hjรฆlp af Apex.
- Du kan forespรธrge sObject-poster ved hjรฆlp af SOQL (Salesforce Object Query Language) og SOSL (Salesforce Object Search Language) i Apex.
- Giver dig mulighed for at oprette en enhedstest og udfรธr den for at verificere kodedรฆkning og effektiviteten af โโkoden i Apex.
- Apex udfรธres i et miljรธ med flere lejere, og Salesforce har definerede styregrรฆnser, der forhindrer en bruger i at monopolisere de delte ressourcer. Enhver kode, der overskrider en Salesforce-styregrรฆnse, fejler, og der vises en fejl.
- Et Salesforce-objekt kan bruges som en datatype i Apex. For eksempel:
Account acc = new Account();
Her er Konto et standard Salesforce-objekt.
- Apex opgraderer automatisk med hver Salesforce-udgivelse.
Hvornรฅr bรธr en udvikler vรฆlge Apex?
Apex-kode bรธr kun skrives, hvis et forretningsscenarie er for komplekst til at blive implementeret ved hjรฆlp af den prรฆbyggede peg-og-klik-funktionalitet, der leveres af Salesforce.
Fรธlgende er et par scenarier, hvor du skal skrive Apex-kode:
- At skabe webtjenester, der integrerer Salesforce med andre applikationer.
- At implementere brugerdefineret validering pรฅ sObjects.
- At udfรธre brugerdefineret Apex-logik, nรฅr en DML-handling udfรธres.
- At implementere funktionalitet, der ikke kan bygges med eksisterende deklarative automatiseringsvรฆrktรธjer som f.eks. Flow.
- At oprette e -mail -tjenester der behandler indholdet, overskrifterne og vedhรฆftede filer i indgรฅende e-mails.
Nรฅr du ved, hvornรฅr Apex er det rigtige valg, er nรฆste skridt at forstรฅ, hvad der sker med din kode, nรฅr du har gemt den.
Apex' arbejdsstruktur
Fรธlgende er handlingsforlรธbet for Apex-kode:
- Udviklerhandling: Nรฅr udvikleren gemmer kode pรฅ platformen, kompileres al Apex-koden til et sรฆt instruktioner, som Apex runtime-fortolkeren kan forstรฅ, og disse instruktioner gemmes derefter som metadata pรฅ platformen.
- Slutbrugerhandling: Nรฅr en brugerhรฆndelse udfรธrer Apex-kode, henter platformserveren de kompilerede instruktioner fra metadataene og kรธrer dem gennem Apex-fortolkeren, fรธr resultatet returneres.
Diagrammet nedenfor viser, hvordan udvikler- og slutbrugerhandlingerne interagerer med Lightning Platform-applikationsserveren:
Apex udviklingsmiljรธ
Apex-kode kan udvikles enten i en sandkasse eller i en Developer Edition-organisation i Salesforce.
Det er bedst at udvikle koden i et sandkassemiljรธ og derefter implementere den i produktionsmiljรธet, som illustreret nedenfor:
Apex-kodeudviklingsvรฆrktรธjer: Fรธlgende er de tre vรฆrktรธjer, der er tilgรฆngelige til at udvikle Apex-kode i alle udgaver af Salesforce:
- Developer Console
- Visual Studio Code med Salesforce Extension Pack (denne erstatter den udgรฅede Force.com IDE)
- Code editor i Salesforce-opsรฆtningsbrugergrรฆnsefladen
Nรฅr dit miljรธ er klar, lad os se pรฅ selve sprogets byggesten, startende med datatyper.
Datatyper i Apex
Fรธlgende er de datatyper, der understรธttes af Apex:
Primitive
Heltal, Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID og Boolean betragtes som primitive datatyper. Alle primitive datatyper sendes efter vรฆrdi, ikke efter reference.
Kollektioner
Tre typer samlinger er tilgรฆngelige i Apex:
- Liste: Det er en ordnet samling af primitiver, sObjects, samlinger eller Apex-objekter baseret pรฅ indekser.
- Sรฆt: En uordnet samling af unikke elementer, der ikke indeholder dubletter.
- Kort: Det er en samling af unikke nรธgler, der knyttes til enkelte vรฆrdier, som kan vรฆre primitiver, sObjects, samlinger eller Apex-objekter.
sObjekt
Dette er en speciel datatype i Salesforce. Det ligner et bord i SQL og indeholder felter, der ligner kolonner i SQL.
Enums
En enum er en mavemuskeltract-datatype, der lagrer รฉn vรฆrdi af et endeligt sรฆt af specificerede identifikatorer.
Klasser, objekter og grรฆnseflader
Brugerdefinerede Apex-klasser og -grรฆnseflader kan ogsรฅ bruges som datatyper. Et objekt refererer til en forekomst af enhver datatype, der understรธttes i Apex.
Apex syntaks
Variabel erklรฆring
Da Apex er et sprog med stรฆrke typer, er det obligatorisk at deklarere en variabel med en datatype i Apex.
For eksempel:
Contact con = new Contact();
Her er variablen con deklareret med Contact som datatype.
SOQL-forespรธrgsel
SOQL stรฅr for Salesforce Object Query Language. SOQL bruges til at hente sObject-poster fra Salesforce-databasen. For eksempel:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Ovenstรฅende forespรธrgsel henter en kontopost fra Salesforce-databasen.
Lรธkkeerklรฆring
En loop-sรฆtning bruges til at iterere over posterne i en liste. Antallet af iterationer er lig med antallet af poster i listen. For eksempel:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
//your logic
}
I ovenstรฅende kodestykke er listOfAccounts en variabel af datatypen List.
Flowkontrolerklรฆring
En flowkontrolsรฆtning er nyttig, nรฅr du vil udfรธre nogle linjer kode baseret pรฅ bestemte betingelser.
For eksempel:
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
}
Ovenstรฅende kodestykke forespรธrger kontoposter fra databasen og kontrollerer listestรธrrelsen.
DML-erklรฆring
DML stรฅr for Data Manipulation Language. DML-sรฆtninger bruges til at manipulere data i Salesforce-databasen. For eksempel:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Apex Access Specificators
Fรธlgende er de adgangsspecifikationer, der understรธttes af Apex:
offentlige
Denne adgangsspecifikation giver adgang til en klasse, metode eller variabel, der skal bruges af Apex i et navneomrรฅde.
Privat
Denne adgangsspecifikation giver adgang til en klasse, metode eller variabel, der kan bruges lokalt eller inden for den del af koden, hvor den er defineret. Alle metoder og variabler, der ikke har en defineret adgangsspecifikation, bruger standardadgangsspecifikationen private.
Beskyttet
Denne adgangsspecifikation giver adgang til en metode eller variabel, der kan bruges af alle indre klasser inden for den definerende Apex-klasse.
Global
Denne adgangsspecifikation giver adgang til en klasse, metode eller variabel, der skal bruges af Apex inden for et navneomrรฅde sรฅvel som uden for navneomrรฅdet. Det er god praksis ikke at bruge det globale nรธgleord, medmindre det er nรธdvendigt.
Nรธgleord i Apex
Med deling
Hvis en klasse er defineret med dette nรธgleord, hรฅndhรฆves alle de delingsregler, der gรฆlder for den aktuelle bruger. Hvis dette nรธgleord mangler, udfรธres koden i systemkontekst.
For eksempel:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Uden at dele
Hvis en klasse er defineret med dette nรธgleord, hรฅndhรฆves de delingsregler, der gรฆlder for den aktuelle bruger, ikke.
For eksempel:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
statisk
En variabel eller metode defineret med nรธgleordet static initialiseres รฉn gang og associeres med klassen. Statiske variabler og metoder kan kaldes direkte med klassenavnet uden at oprette en instans af klassen.
Endelig
En konstant eller metode defineret med nรธgleordet final kan ikke tilskrives. For eksempel:
public class myCls {
static final Integer INT_CONST = 10;
}
Hvis du forsรธger at tilsidesรฆtte vรฆrdien af โโdenne INT_CONST-variabel, fรฅr du undtagelsen โ System.FinalException: Den endelige variable er allerede initialiseret.
Returnering
Dette sรธgeord returnerer en vรฆrdi fra en metode. For eksempel:
public String getName() {
return 'Test';
}
Null
Den definerer en nulkonstant og kan tildeles en variabel. For eksempel:
Boolean b = null;
Virtual
Hvis en klasse er defineret med nรธgleordet virtual, kan den udvides og tilskrives.
Abstract
Hvis en klasse er defineret med abstract-sรธgeordet, skal det indeholde mindst รฉn metode med sรธgeordet abstract, og den metode skal kun have en signatur.
For eksempel:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex streng
En streng er et sรฆt tegn uden tegnbegrรฆnsning. For eksempel:
String name = 'Test';
Der er adskillige indbyggede metoder i String-klassen i Salesforce. Fรธlgende er et par ofte anvendte metoder:
forkorte (maxWidth)
Denne metode afkorter en streng til den angivne lรฆngde og returnerer den, hvis lรฆngden af โโden givne streng er lรฆngere end den angivne lรฆngde; ellers returnerer den den oprindelige streng. Hvis vรฆrdien af โโmaxWidth-variablen er mindre end 4, udlรธser denne metode en runtime-undtagelse โ System.StringException: Minimum forkortelsesbredde er 4.
For eksempel:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
kapitaliser ()
Denne metode konverterer det fรธrste bogstav i en streng til store og smรฅ bogstaver og returnerer det.
For eksempel:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
indeholder (understreng)
Denne metode returnerer sand, hvis strengen, der kalder metoden, indeholder den angivne delstreng.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
er lig (stringOrId)
Denne metode returnerer sand, hvis den indtastede parameter ikke er null og reprรฆsenterer den samme binรฆre tegnsekvens som den streng, der kalder metoden.
Nรฅr man sammenligner id-vรฆrdier, er lรฆngderne af id'erne muligvis ikke ens. Hvis en streng, der reprรฆsenterer et id pรฅ 15 tegn, f.eks. sammenlignes med et objekt, der reprรฆsenterer et id pรฅ 18 tegn, returnerer denne metode stadig sand. For eksempel:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
I ovenstรฅende eksempel sammenligner equals-metoden et objekt-id pรฅ 15 tegn med et objekt-id pรฅ 18 tegn, og hvis begge ID'er reprรฆsenterer den samme binรฆre sekvens, returnerer den sand.
Brug denne metode til at foretage sammenligninger, der skelner mellem store og smรฅ bogstaver.
escapeSingle Quotes(stringToEscape)
Denne metode tilfรธjer et escape-tegn (\) fรธr et enkelt anfรธrselstegn i en streng og returnerer resultatet. Denne metode forhindrer SOQL-injektion under oprettelse af en dynamisk SOQL-forespรธrgsel. Den sikrer, at alle enkelt anfรธrselstegn behandles som omsluttende strenge i stedet for databasekommandoer.
For eksempel:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
fjern (understreng)
Denne metode fjerner alle forekomster af den nรฆvnte delstreng fra den streng, der kalder metoden, og returnerer den resulterende streng.
For eksempel:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
understreng (startindeks)
Denne metode returnerer en delstreng, der starter fra tegnet i startIndex og fortsรฆtter til slutningen af โโstrengen.
For eksempel:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
baglรฆns()
Denne metode vender alle tegnene i en streng om og returnerer den. For eksempel:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
trimme ()
Denne metode fjerner alle fรธrende og efterfรธlgende mellemrum fra en streng og returnerer den.
valueOf(toConvert)
Denne metode returnerer strengreprรฆsentationen af โโdet overfรธrte objekt.
Strenge, klasser og nรธgleord mรธdes, nรฅr du begynder at pakke logik i genanvendelige enheder, hvilket er prรฆcis, hvad Apex-klasser er til for.
Apex klasse
En Apex-klasse er en blueprint eller skabelon, som objekter oprettes ud fra. Et objekt er en forekomst af en klasse.
Der er tre mรฅder at oprette Apex-klasser i Salesforce:
- Developer Console
- Visual Studio Code med Salesforce-udvidelsespakken
- Apex-klassedetaljeside i Opsรฆtning
I Apex kan du definere en ydre klasse, ogsรฅ kaldet en topniveauklasse, og du kan ogsรฅ definere klasser inden for en ydre klasse, kaldet indre klasser.
Det er obligatorisk at bruge en adgangsmodifikator som global eller public i deklarationen af โโen outer klasse.
Det er ikke nรธdvendigt at bruge en adgangsmodifikator i deklarationen af โโindre klasser.
En Apex-klasse defineres ved hjรฆlp af nรธgleordet class efterfulgt af klassenavnet.
Nรธgleordet extends bruges til at udvide en eksisterende klasse i en Apex-klasse, og nรธgleordet implements bruges til at implementere en grรฆnseflade i en Apex-klasse.
Salesforce Apex understรธtter ikke multipel nedarvning; en Apex-klasse kan kun udvide รฉn eksisterende Apex-klasse, men kan implementere flere grรฆnseflader.
En Apex-klasse kan indeholde en brugerdefineret konstruktรธr, og hvis en brugerdefineret konstruktรธr ikke er tilgรฆngelig, bruges en standardkonstruktรธr. Koden i en konstruktรธr udfรธres, nรฅr en instans af en klasse oprettes.
Syntaks for en Apex-klasse:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
Nรธgleordet new bruges til at oprette en instans af en Apex-klasse. Nedenfor er syntaksen for oprettelse af en instans af en Apex-klasse:
myApexClass obj = new myApexClass();
Apex Getter og Setter
En Apex-egenskab ligner en Apex-variabel. En getter og en setter er nรธdvendige for en Apex-egenskab. De kan bruges til at udfรธre kode, fรธr egenskabsvรฆrdien tilgรฅs eller รฆndres. Koden i get-tilgangen udfรธres, nรฅr en egenskabsvรฆrdi lรฆses. Koden i set-tilgangen udfรธres, nรฅr en egenskabsvรฆrdi รฆndres. Enhver egenskab, der kun har en get-tilgang, betragtes som skrivebeskyttet, enhver egenskab, der kun har en set-tilgang, betragtes som skrivebeskyttet, og enhver egenskab, der har bรฅde get- og set-tilgange, betragtes som lรฆse-skrivebeskyttet. Syntaks for en Apex-egenskab:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Her er access_modifier adgangsmodifikatoren for egenskaben, return_type er datatypen for egenskaben, og property_name er navnet pรฅ egenskaben.
Nedenfor er et eksempel pรฅ en Apex-egenskab, der har bรฅde get- og set-tilgangspunkter:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Her er egenskabsnavnet navn, det er en offentlig egenskab, og den returnerer en String-datatype.
Det er ikke obligatorisk at have kode i get- og set-blokkene. Disse blokke kan stรฅ tomme for at definere en automatisk egenskab. For eksempel:
public double MyReadWriteProp{ get; set; }
Get- og set-accessorer kan ogsรฅ defineres med deres egne adgangsmodifikatorer. Hvis en accessor er defineret med en modifikator, tilsidesรฆtter den egenskabens adgangsmodifikator. For eksempel:
public String name{private get; set;}// name is private for read and public for write.
Klasser definerer genanvendelig logik, som du kalder eksplicit. Triggere, som dรฆkkes nedenfor, kรธrer automatisk, nรฅr poster รฆndres.
Apex Trigger
Apex-udlรธsere gรธr det muligt at udfรธre brugerdefineret Apex fรธr og efter en DML-handling er udfรธrt.
Apex understรธtter fรธlgende to typer triggere:
Fรธr udlรธsere: Disse udlรธsere bruges til at validere og opdatere et felts vรฆrdi, fรธr posten gemmes i databasen.
Efter udlรธsere: Disse udlรธsere bruges til at fรฅ adgang til feltvรฆrdier (f.eks. post-ID og feltet LastModifiedDate), der angives af systemet, efter en post er blevet committet til databasen. Disse feltvรฆrdier kan bruges til at รฆndre andre poster. Poster, der udlรธses efter udlรธsere, er skrivebeskyttede.
Det er god praksis at skrive bulk-udlรธsere. En bulk-udlรธser kan behandle en enkelt post sรฅvel som flere poster ad gangen.
Syntaks for en Apex-trigger:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Her er TriggerName navnet pรฅ triggeren, ObjectName er navnet pรฅ det objekt, som triggeren er skrevet pรฅ, og trigger_events er en kommasepareret liste over hรฆndelser.
Fรธlgende er de hรฆndelser, der understรธttes af Apex-udlรธsere: fรธr indsรฆttelse, fรธr opdatering, fรธr sletning, efter indsรฆttelse, efter opdatering, efter sletning, efter undelete.
Statiske nรธgleord kan ikke bruges i en Apex-trigger. Alle nรธgleord, der gรฆlder for indre klasser, kan bruges i en Apex-trigger.
Der er implicitte variabler defineret af hver trigger, der returnerer kรธrselskonteksten. Disse variabler er defineret i System.Trigger-klassen og kaldes kontekstvariabler. De to skรฆrmbilleder nedenfor viser de kontekstvariabler, der understรธttes af Apex-triggere:
Fรธlgende er overvejelser vedrรธrende kontekstvariabler i Apex-udlรธsere:
- Brug ikke trigger.new og trigger.old i DML-operationer.
- Trigger.new kan ikke slettes.
- Trigger.new er skrivebeskyttet efter triggere.
- Trigger.new kan kun bruges til at รฆndre vรฆrdierne af felter pรฅ det samme objekt fรธr triggere.
De to skรฆrmbilleder nedenfor viser overvejelserne vedrรธrende specifikke handlinger i forskellige udlรธsende hรฆndelser:
Triggere hรฅndterer realtidslogik, men nogle job er simpelthen for store til en enkelt transaktion. Det er her, batch-Apex kommer ind i billedet.
Batch-klasse i Apex
En batchklasse i Salesforce bruges til at behandle et stort antal poster, der ville overskride Apex-regulatorgrรฆnserne, hvis de blev behandlet normalt. En batchklasse udfรธrer koden asynkront.
Fรธlgende er fordelene ved en batchklasse:
- En batchklasse behandler dataene i bidder, og hvis รฉt bidder ikke behandles korrekt, rulles de korrekt behandlede bidder ikke tilbage.
- Hvert datastykke i en batchklasse behandles med et nyt sรฆt governor-grรฆnser, som sikrer, at koden udfรธres inden for governor-udfรธrelsesgrรฆnserne.
Database.Batchable-grรฆnsefladen skal implementeres af en Apex-klasse for at kunne bruges som en batchklasse. Den indeholder tre metoder, der skal implementeres af batchklassen:
1. start()
Denne metode genererer omfanget af poster eller objekter, der skal behandles af interfacemetoden `execute`. Den kaldes kun รฉn gang under udfรธrelsen af โโbatchen. Denne metode returnerer enten et Database.QueryLocator-objekt eller en Iterable. Antallet af poster, der kan hentes af en SOQL-forespรธrgsel ved hjรฆlp af Database.QueryLocator-objektet, er 50 millioner, men ved brug af en Iterable er det samlede antal poster, der kan hentes af SOQL-forespรธrgslen, kun 50,000. En Iterable bruges til at generere et komplekst omfang for batchklassen.
Syntaks for startmetoden:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. udfรธr()
Denne metode bruges til at behandle hver data-klump. Execute-metoden kaldes for hver data-klump. Standardbatchstรธrrelsen for udfรธrelse er 200 poster. Execute-metoden tager to argumenter:
En reference til Database.BatchableContext-objektet,
En liste over sObjects, sรฅsom List , eller en liste over parametriserede typer. Syntaks for execute-metoden:
global void execute(Database.BatchableContext bc, List<P> records){}
3. finish()
Metoden finish kaldes รฉn gang under udfรธrelsen af โโbatchklassen. Efterbehandlingsoperationer kan udfรธres i finish-metoden. For eksempel: afsendelse af en bekrรฆftelsesmail. Denne metode kaldes, nรฅr alle batcher er behandlet. Syntaks for finish-metoden:
global void finish(Database.BatchableContext bc){}
Database.BatchableContext-objekt
Hver metode i Database.Batchable-grรฆnsefladen har en reference til et Database.BatchableContext-objekt.
Dette objekt bruges til at track status for batchjobbet.
Fรธlgende er de instansmetoder, der leveres af BatchableContext:
- getChildJobId(): Denne metode returnerer ID'et for det batchjob, der i รธjeblikket behandles.
- getJobId(): Denne metode returnerer batchjobbets ID.
Nedenfor er syntaksen for en batchklasse:
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-metode
Database.executeBatch-metoden bruges til at udfรธre en batchklasse.
Denne metode bruger to parametre: en instans af den batchklasse, der skal behandles, og en valgfri scope-parameter til at angive batchstรธrrelsen. Hvis den ikke er angivet, bruges standardstรธrrelsen pรฅ 200.
Syntaks for Database.executeBatch:
Database.executeBatch(myBatchObject, scope)
Udfรธrelse af en batchklasse med navnet MyBatchClass:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Database.Stateful
En batchklasse er som standard tilstandslรธs. Hver gang execute-metoden kaldes, modtages en ny kopi af objektet, og alle klassens variabler initialiseres.
Database.Stateful implementeres for at gรธre en batchklasse stateful.
Hvis din batchklasse implementerer Database.Stateful-grรฆnseflade, alle instansvariabler bevarer deres vรฆrdier, men statiske variabler nulstilles mellem transaktioner.
Asynkron Apex Beyond Batch
Batch Apex er kun รฉn af flere mรฅder at kรธre kode asynkront pรฅ. Salesforce tilbyder fire asynkrone muligheder, og valget af den rigtige afhรฆnger af, hvor meget data du behandler, og om job skal kรฆdes sammen eller planlรฆgges.
- Fremtidige metoder: Disse er annoteret med @future og er bedst egnet til simple, glemte handlinger, sรฅsom udkald til eksterne webtjenester.
- Kรธbar Apex: Implementerer Queueable-grรฆnsefladen, accepterer komplekse objekttyper, returnerer et job-ID og understรธtter kรฆdedannelse af รฉt job til et andet.
- Batch Apex: Behandler meget store datamรฆngder i bidder, som beskrevet ovenfor.
- Planlagt apex: Implementerer den planlagte grรฆnseflade, sรฅ en klasse kรธrer pรฅ et bestemt tidspunkt, f.eks. et natligt oprydningsjob.
| Type | Bedste For | Nรธglefunktion |
|---|---|---|
| Fremtidig metode | Enkle opfordringer | Affyr og glem |
| Kรธbar Apex | Sekventiel behandling | Jobkรฆde og overvรฅgning |
| Batch Apex | Millioner af optegnelser | Chunking-behandling |
| Planlagt Apex | Tilbagevendende job | Cron-baseret timing |
Uanset hvilken udfรธrelsesmodel du vรฆlger, mรฅles hver transaktion stadig i forhold til de platformomfattende styringsgrรฆnser, der er anfรธrt nedenfor.
Apex-guvernรธrgrรฆnser
Apex-regulatorgrรฆnser er de grรฆnser, der hรฅndhรฆves af Apex-kรธrselsprogrammet for at sikre, at eventuel ustabil Apex-kode og -processer ikke monopoliserer de delte ressourcer og ikke forstyrrer andre brugeres behandling i multi-tenant-miljรธet. Disse grรฆnser verificeres mod hver Apex-transaktion. Fรธlgende er de regulatorgrรฆnser, der er defineret af Salesforce for hver Apex-transaktion:
| Beskrivelse | Begrรฆns |
|---|---|
| SOQL-forespรธrgsler, der kan udfรธres i en synkron transaktion | 100 |
| SOQL-forespรธrgsler, der kan udfรธres i en asynkron transaktion | 200 |
| Records, der kan hentes af en SOQL-forespรธrgsel | 50,000 |
| Records, der kan hentes af Database.getQueryLocator | 10,000 |
| SOSL-forespรธrgsler, der kan udfรธres i en Apex-transaktion | 20 |
| Records, der kan hentes ved en SOSL-forespรธrgsel | 2,000 |
| DML-udsagn, der kan udfรธres i en Apex-transaktion | 150 |
| Records, der kan behandles som et resultat af en DML-sรฆtning, Approval.process eller database.emptyRecycleBin | 10,000 |
| Udkald, der kan udfรธres i en Apex-transaktion | 100 |
| Kumulativ timeoutgrรฆnse for alle udkald, der udfรธres i en Apex-transaktion | 120 sekunder |
| Begrรฆnsning af Apex-job, der kan fรธjes til kรธen med System.enqueueJob | 50 |
| Udfรธrelsestidsgrรฆnse for hver Apex-transaktion | 10 minutter |
| Begrรฆnsning af tegn, der kan bruges i en Apex-klasse og -udlรธser | 1 millioner |
| CPU-tidsgrรฆnse for en synkron transaktion | 10,000 millisekunder |
| CPU-tidsgrรฆnse for en asynkron transaktion | 60,000 millisekunder |
| Samlet bunkestรธrrelse | 6 MB (synkron) / 12 MB (asynkron) |
Sรฅdan skriver du en testklasse i Apex
Salesforce krรฆver, at mindst 75 procent af din Apex-kode er dรฆkket af enhedstests, fรธr du kan implementere den i produktion, og hver trigger skal have en vis dรฆkning. At skrive testklasser er derfor en central Apex-fรฆrdighed, ikke et valgfrit ekstraudstyr.
En testklasse er annoteret med @isTest, og hver testmetode er ogsรฅ markeret med @isTest. Testmetoder committer ikke data til databasen og ser ikke de fleste eksisterende organisationsdata, sรฅ hver test opretter sine egne poster. Metoderne Test.startTest() og Test.stopTest() giver den testede kode et nyt sรฆt af styregrรฆnser, og assertions verificerer, at logikken opfรธrte sig som forventet.
Her er en simpel testklasse til logik for oprettelse af konto:
@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);
}
}
Fรธlg disse retningslinjer, nรฅr du skriver prรธver:
- Brug @testSetup-metoden til at oprette delte testdata รฉn gang for alle testmetoder i klassen.
- Test masseadfรฆrd ved at indsรฆtte 200 poster, ikke kun รฉn.
- Dรฆk positive, negative og scenarier med begrรฆnsede brugere.
- Inkluder altid meningsfulde System.assert-udsagn; dรฆkning uden assertions beviser intet.
Apex Bedste Practices
Begyndere skriver ofte Apex, der fungerer for รฉn post, men mislykkes i masseoperationer i den virkelige verden. Fremgangsmรฅderne nedenfor holder din kode inden for grรฆnserne for styringssystemet og er nemmere at vedligeholde:
- Massรฉr alt: Skriv logik, der hรฅndterer samlinger af poster, fordi udlรธsere kan modtage op til 200 poster i en enkelt batch.
- Hold SOQL og DML ude af loops: Forespรธrg fรธr lรธkken, indsaml รฆndringer i en liste, og udfรธr รฉn DML-sรฆtning efter lรธkken.
- รn trigger pr. objekt: Hold triggere logisk frie og deleger arbejdet til handlerklasser, hvilket gรธr udfรธrelsesrรฆkkefรธlgen forudsigelig.
- Brug med deling: Hรฅndhรฆv sikkerhed pรฅ postniveau, medmindre der er en dokumenteret grund til at kรธre i systemkontekst.
- Undgรฅ hardkodning af ID'er: Post-ID'er varierer mellem sandkasser og produktionsbaserede, sรฅ forespรธrg efter dem, eller brug brugerdefinerede metadata i stedet.
- Overvรฅgningsgrรฆnser i kode: Metoderne i Limits-klassen, f.eks. Limits.getQueries(), giver dig mulighed for at kontrollere ressourceforbruget under kรธrsel.
๐ก Tip: Kรธr din kode mod 200 poster i en sandkasse fรธr udrulning. De fleste fejl i governor-grรฆnser opstรฅr kun ved bulkvolumen, og det er langt billigere at opdage dem tidligt end at fejlfinde dem i produktion.






