Salesforce Apex-veiledning for nybegynnere
โก Smart oppsummering
Apex-programmering gir Salesforce-utviklere et objektorientert, sterkt typesprรฅk for รฅ legge til tilpasset forretningslogikk i CRM-systemet. Det driver klasser, utlรธsere og batchjobber, mens styrebegrensninger holder den delte flerbrukerplattformen stabil.

Hva er Apex i Salesforce?
Apex er et objektorientert og sterkt typebasert programmeringssprรฅk utviklet av Salesforce for รฅ bygge programvare som en tjeneste (SaaS) og kundeforholdsstyring (CRM). Apex hjelper utviklere med รฅ lage tredjeparts SaaS-applikasjoner og legge til forretningslogikk i systemhendelser ved รฅ tilby backend-databasestรธtte og klient-server-grensesnitt.
Apex hjelper utviklere med รฅ legge til forretningslogikk i systemhendelser som knappeklikk, relaterte postoppdateringer og Visualforce-sider. Apex har en syntaks som ligner pรฅ Java. Registrer deg for Salesforce for รฅ lรฆre hvordan CRM-systemet fungerer.
Funksjoner i Apex programmeringssprรฅk
Her er de viktige funksjonene til Salesforce Apex:
- Apex er et sprรฅk som ikke skiller mellom store og smรฅ bokstaver.
- Du kan utfรธre DML-operasjoner som INSERT, UPDATE, UPSERT og DELETE pรฅ sObject-poster ved hjelp av Apex.
- Du kan spรธrre sObject-poster ved hjelp av SOQL (Salesforce Object Query Language) og SOSL (Salesforce Object Search Language) i Apex.
- Lar deg lage en enhetstest og utfรธr den for รฅ bekrefte kodedekning og effektiviteten til koden i Apex.
- Apex kjรธres i et miljรธ med flere leietakere, og Salesforce har definerte styregrenser som hindrer en bruker i รฅ monopolisere de delte ressursene. All kode som krysser en Salesforce-styregrense mislykkes, og det vises en feil.
- Et Salesforce-objekt kan brukes som en datatype i Apex. For eksempel:
Account acc = new Account();
Her er Konto et standard Salesforce-objekt.
- Apex oppgraderer automatisk med hver Salesforce-utgivelse.
Nรฅr bรธr en utvikler velge Apex?
Apex-kode bรธr bare skrives hvis et forretningsscenario er for komplekst til รฅ implementeres ved hjelp av den forhรฅndsbygde pek-og-klikk-funksjonaliteten som tilbys av Salesforce.
Fรธlgende er noen scenarier der du mรฅ skrive Apex-kode:
- For รฅ lage webtjenester som integrerer Salesforce med andre applikasjoner.
- For รฅ implementere tilpasset validering pรฅ sObjects.
- For รฅ utfรธre tilpasset Apex-logikk nรฅr en DML-operasjon utfรธres.
- ร implementere funksjonalitet som ikke kan bygges med eksisterende deklarative automatiseringsverktรธy som Flow.
- ร sette opp e -posttjenester som behandler innholdet, overskriftene og vedleggene i innkommende e-post.
Nรฅr du vet nรฅr Apex er det riktige valget, er neste trinn รฅ forstรฅ hva som skjer med koden din etter at du lagrer den.
Arbeidsstrukturen til Apex
Fรธlgende er handlingsflyten for Apex-kode:
- Utviklerhandling: Nรฅr utvikleren lagrer kode pรฅ plattformen, kompileres all Apex-koden til et sett med instruksjoner som Apex-kjรธretidstolken kan forstรฅ, og disse instruksjonene lagres deretter som metadata pรฅ plattformen.
- Sluttbrukerhandling: Nรฅr en brukerhendelse utfรธrer Apex-kode, henter plattformserveren de kompilerte instruksjonene fra metadataene og kjรธrer dem gjennom Apex-tolkeren fรธr resultatet returneres.
Diagrammet nedenfor viser hvordan utvikler- og sluttbrukerhandlingene samhandler med Lightning Platform-applikasjonsserveren:
Apex utviklingsmiljรธ
Apex-kode kan utvikles enten i en sandkasse eller i en Developer Edition-organisasjon av Salesforce.
Det er lurt รฅ utvikle koden i et sandkassemiljรธ og deretter distribuere den til produksjonsmiljรธet, som illustrert nedenfor:
Apex-kodeutviklingsverktรธy: Fรธlgende er de tre verktรธyene som er tilgjengelige for รฅ utvikle Apex-kode i alle versjoner av Salesforce:
- Utviklerkonsoll
- Visual Studio Code med Salesforce Extension Pack (dette erstatter den utgรฅtte Force.com IDE-en)
- Code redigeringsprogrammet i brukergrensesnittet for Salesforce-oppsettet
Nรฅr miljรธet ditt er klart, la oss se pรฅ byggeklossene i selve sprรฅket, og starte med datatyper.
Datatyper i Apex
Fรธlgende er datatypene som stรธttes av Apex:
Primitive
Heltall, Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID og Boolean regnes som primitive datatyper. Alle primitive datatyper sendes etter verdi, ikke etter referanse.
Kategorier
Tre typer samlinger er tilgjengelige i Apex:
- Liste: Det er en ordnet samling av primitiver, sObjects, samlinger eller Apex-objekter basert pรฅ indekser.
- Sett: En uordnet samling av unike elementer som ikke inneholder duplikater.
- Kart: Det er en samling av unike nรธkler som tilordnes til enkeltverdier, som kan vรฆre primitiver, sObjects, samlinger eller Apex-objekter.
sObjekt
Dette er en spesiell datatype i Salesforce. Det ligner pรฅ et bord i SQL og inneholder felt som ligner pรฅ kolonner i SQL.
Opptegnelser
En enum er en magemuskeltract-datatype som lagrer รฉn verdi av et endelig sett med spesifiserte identifikatorer.
Klasser, objekter og grensesnitt
Brukerdefinerte Apex-klasser og -grensesnitt kan ogsรฅ brukes som datatyper. Et objekt refererer til en forekomst av en hvilken som helst datatype som stรธttes i Apex.
Apex-syntaks
Variabel erklรฆring
Siden Apex er et sprรฅk med sterk typede egenskaper, er det obligatorisk รฅ deklarere en variabel med en datatype i Apex.
For eksempel:
Contact con = new Contact();
Her deklareres variabelen con med Contact som datatype.
SOQL-spรธrring
SOQL stรฅr for Salesforce Object Query Language. SOQL brukes til รฅ hente sObject-poster fra Salesforce-databasen. For eksempel:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Spรธrringen ovenfor henter en kontopost fra Salesforce-databasen.
Loop Statement
En lรธkkesetning brukes til รฅ iterere over postene i en liste. Antall iterasjoner er lik antall 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 kodebiten ovenfor er listOfAccounts en variabel av datatypen List.
Flytkontrollerklรฆring
En flytkontrollsetning er nyttig nรฅr du vil kjรธre noen linjer med kode basert pรฅ visse 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
}
Kodebiten ovenfor spรธr etter kontoposter fra databasen og kontrollerer listestรธrrelsen.
DML-erklรฆring
DML stรฅr for Data Manipulation Language. DML-setninger brukes til รฅ manipulere data i Salesforce-databasen. For eksempel:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Apex Access-spesifikasjoner
Fรธlgende er tilgangsspesifikasjonene som stรธttes av Apex:
offentlig
Denne tilgangsspesifikatoren gir tilgang til en klasse, metode eller variabel som skal brukes av Apex i et navneomrรฅde.
Privat
Denne tilgangsspesifikatoren gir tilgang til en klasse, metode eller variabel som skal brukes lokalt, eller innenfor den delen av koden der den er definert. Alle metoder og variabler som ikke har en definert tilgangsspesifikator, tar standard tilgangsspesifikatoren private.
beskyttet
Denne tilgangsspesifikatoren gir tilgang til en metode eller variabel som skal brukes av alle indre klasser innenfor den definerende Apex-klassen.
Global
Denne tilgangsspesifikatoren gir tilgang til en klasse, metode eller variabel som skal brukes av Apex innenfor et navneomrรฅde sรฅ vel som utenfor navneomrรฅdet. Det er god praksis รฅ ikke bruke det globale nรธkkelordet med mindre det er nรธdvendig.
Nรธkkelord i Apex
Med deling
Hvis en klasse er definert med dette nรธkkelordet, hรฅndheves alle delingsreglene som gjelder for den gjeldende brukeren. Hvis dette nรธkkelordet mangler, kjรธres koden under systemkontekst.
For eksempel:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Uten รฅ dele
Hvis en klasse er definert med dette nรธkkelordet, hรฅndheves ikke delingsreglene som gjelder for den gjeldende brukeren.
For eksempel:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
Statisk
En variabel eller metode definert med nรธkkelordet static initialiseres รฉn gang og assosieres med klassen. Statiske variabler og metoder kan kalles direkte med klassenavnet uten รฅ opprette en instans av klassen.
Slutten
En konstant eller metode definert med nรธkkelordet final kan ikke overstyres. For eksempel:
public class myCls {
static final Integer INT_CONST = 10;
}
Hvis du prรธver รฅ overstyre verdien til denne INT_CONST-variabelen, vil du fรฅ unntaket โ System.FinalException: Den endelige variabelen er allerede initialisert.
Tilbake
Dette nรธkkelordet returnerer en verdi fra en metode. For eksempel:
public String getName() {
return 'Test';
}
Null
Den definerer en nullkonstant og kan tilordnes en variabel. For eksempel:
Boolean b = null;
virtuelle
Hvis en klasse er definert med nรธkkelordet virtual, kan den utvides og overstyres.
Abstract
Hvis en klasse er definert med abstract-nรธkkelordet, mรฅ det inneholde minst รฉn metode med nรธkkelordet abstract, og den metoden skal bare ha en signatur.
For eksempel:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex-streng
En streng er et sett med tegn uten tegnbegrensning. For eksempel:
String name = 'Test';
Det finnes flere innebygde metoder i String-klassen i Salesforce. Fรธlgende er noen ofte brukte metoder:
forkorte (maxWidth)
Denne metoden avkorter en streng til den angitte lengden og returnerer den hvis lengden pรฅ den gitte strengen er lengre enn den angitte lengden; ellers returnerer den den opprinnelige strengen. Hvis verdien av maxWidth-variabelen er mindre enn 4, kaster denne metoden et kjรธretidsunntak โ System.StringException: Minimum forkortelsesbredde er 4.
For eksempel:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
kapitaliser ()
Denne metoden konverterer den fรธrste bokstaven i en streng til store og smรฅ bokstaver og returnerer den.
For eksempel:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
inneholder (understreng)
Denne metoden returnerer sann hvis strengen som kaller metoden inneholder den angitte delstrengen.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
lik(stringOrId)
Denne metoden returnerer sann hvis parameteren som sendes ikke er null og representerer den samme binรฆre tegnsekvensen som strengen som kaller metoden.
Nรฅr man sammenligner ID-verdier, kan det hende at lengden pรฅ ID-ene ikke er like. Hvis for eksempel en streng som representerer en ID pรฅ 15 tegn sammenlignes med et objekt som representerer en ID pรฅ 18 tegn, returnerer denne metoden fortsatt sann. For eksempel:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
I eksemplet ovenfor sammenligner equals-metoden en objekt-ID pรฅ 15 tegn med en objekt-ID pรฅ 18 tegn, og hvis begge ID-ene representerer den samme binรฆre sekvensen, returnerer den sann.
Bruk denne metoden for รฅ gjรธre sammenligninger som skiller mellom store og smรฅ bokstaver.
escapeSingle Quotes(stringToEscape)
Denne metoden legger til et escape-tegn (\) foran et enkelt anfรธrselstegn i en streng og returnerer resultatet. Denne metoden forhindrer SOQL-injeksjon nรฅr man oppretter en dynamisk SOQL-spรธrring. Den sikrer at alle enkelt anfรธrselstegn behandles som omsluttende strenger i stedet for databasekommandoer.
For eksempel:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
fjern (understreng)
Denne metoden fjerner alle forekomster av den nevnte delstrengen fra strengen som kaller metoden og returnerer den resulterende strengen.
For eksempel:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
understreng(startindeks)
Denne metoden returnerer en delstreng som starter fra tegnet i startindeksen og fortsetter til slutten av strengen.
For eksempel:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
omvendt()
Denne metoden reverserer alle tegnene i en streng og returnerer den. For eksempel:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
listverk ()
Denne metoden fjerner alle innledende og etterfรธlgende mellomrom fra en streng og returnerer den.
valueOf(toConvert)
Denne metoden returnerer strengrepresentasjonen av det sendte objektet.
Strenger, klasser og nรธkkelord kommer sammen nรฅr du begynner รฅ pakke logikk til gjenbrukbare enheter, og det er nettopp det Apex-klasser er til for.
Apex klasse
En Apex-klasse er en blรฅkopi eller mal som objekter opprettes fra. Et objekt er en forekomst av en klasse.
Det finnes tre mรฅter รฅ opprette Apex-klasser i Salesforce pรฅ:
- Utviklerkonsoll
- Visual Studio Code med Salesforce-utvidelsespakken
- Apex-klassedetaljside i Oppsett
I Apex kan du definere en ytre klasse, ogsรฅ kalt en toppnivรฅklasse, og du kan ogsรฅ definere klasser innenfor en ytre klasse, kalt indre klasser.
Det er obligatorisk รฅ bruke en tilgangsmodifikator som global eller public i deklarasjonen av en ytre klasse.
Det er ikke nรธdvendig รฅ bruke en tilgangsmodifikator i deklarasjonen av indre klasser.
En Apex-klasse defineres ved hjelp av nรธkkelordet class etterfulgt av klassenavnet.
Nรธkkelordet extends brukes til รฅ utvide en eksisterende klasse i en Apex-klasse, og nรธkkelordet implements brukes til รฅ implementere et grensesnitt i en Apex-klasse.
Salesforce Apex stรธtter ikke multippel arv; en Apex-klasse kan bare utvide รฉn eksisterende Apex-klasse, men kan implementere flere grensesnitt.
En Apex-klasse kan inneholde en brukerdefinert konstruktรธr, og hvis en brukerdefinert konstruktรธr ikke er tilgjengelig, brukes en standardkonstruktรธr. Koden i en konstruktรธr kjรธres nรฅr en forekomst av en klasse opprettes.
Syntaks for en Apex-klasse:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
Nรธkkelordet new brukes til รฅ opprette en forekomst av en Apex-klasse. Nedenfor finner du syntaksen for รฅ opprette en forekomst av en Apex-klasse:
myApexClass obj = new myApexClass();
Apex Getter og Setter
En Apex-egenskap ligner pรฅ en Apex-variabel. En getter og en setter er nรธdvendige for en Apex-egenskap. De kan brukes til รฅ kjรธre kode fรธr egenskapsverdien รฅpnes eller endres. Koden i get-tilgangen kjรธres nรฅr en egenskapsverdi leses. Koden i set-tilgangen kjรธres nรฅr en egenskapsverdi endres. Enhver egenskap som bare har en get-tilgang regnes som skrivebeskyttet, en hvilken som helst egenskap som bare har en set-tilgang regnes som skrivebeskyttet, og en hvilken som helst egenskap som har bรฅde get- og set-tilgang regnes som lese-skrive. Syntaks for en Apex-egenskap:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Her er access_modifier tilgangsmodifikatoren til egenskapen, return_type er datatypen til egenskapen, og property_name er navnet pรฅ egenskapen.
Nedenfor er et eksempel pรฅ en Apex-egenskap som har bรฅde get- og set-tilgangsenheter:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Her er egenskapsnavnet navn, det er en offentlig egenskap, og den returnerer en String-datatype.
Det er ikke obligatorisk รฅ ha kode i get- og set-blokkene. Disse blokkene kan stรฅ tomme for รฅ definere en automatisk egenskap. For eksempel:
public double MyReadWriteProp{ get; set; }
Get- og set-tilgangsgrupper kan ogsรฅ defineres med egne tilgangsmodifikatorer. Hvis en tilgangsgruppe er definert med en modifikator, overstyrer den tilgangsmodifikatoren til egenskapen. For eksempel:
public String name{private get; set;}// name is private for read and public for write.
Klasser definerer gjenbrukbar logikk som du kaller eksplisitt. Utlรธsere, som dekkes nedenfor, kjรธres automatisk nรฅr poster endres.
Apex Trigger
Apex-utlรธsere lar deg kjรธre tilpasset Apex fรธr og etter at en DML-operasjon er utfรธrt.
Apex stรธtter fรธlgende to typer triggere:
Fรธr triggere: Disse utlรธserne brukes til รฅ validere og oppdatere verdien til et felt fรธr posten lagres i databasen.
Etter triggere: Disse utlรธserne brukes til รฅ fรฅ tilgang til feltverdier (som post-ID og LastModifiedDate-feltet) som angis av systemet etter at en post er lagret i databasen. Disse feltverdiene kan brukes til รฅ endre andre poster. Poster som utlรธses etter utlรธsere er skrivebeskyttet.
Det er god praksis รฅ skrive masseutlรธsere. En masseutlรธser kan behandle รฉn enkelt post sรฅ vel som flere poster samtidig.
Syntaks for en Apex-utlรธser:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Her er TriggerName navnet pรฅ utlรธseren, ObjectName er navnet pรฅ objektet som utlรธseren er skrevet pรฅ, og trigger_events er en kommaseparert liste over hendelser.
Fรธlgende er hendelsene som stรธttes av Apex-utlรธsere: fรธr innsetting, fรธr oppdatering, fรธr sletting, etter innsetting, etter oppdatering, etter sletting, etter angret sletting.
Statiske nรธkkelord kan ikke brukes i en Apex-utlรธser. Alle nรธkkelordene som gjelder for indre klasser kan brukes i en Apex-utlรธser.
Det finnes implisitte variabler definert av hver utlรธser som returnerer kjรธretidskonteksten. Disse variablene er definert i System.Trigger-klassen og kalles kontekstvariabler. De to skjermbildene nedenfor viser kontekstvariablene som stรธttes av Apex-utlรธsere:
Fรธlgende er hensynene for kontekstvariabler i Apex-utlรธsere:
- Ikke bruk trigger.new og trigger.old i DML-operasjoner.
- Trigger.new kan ikke slettes.
- Trigger.new er skrivebeskyttet etter triggere.
- Trigger.new kan brukes til รฅ endre verdiene til felt pรฅ samme objekt, kun fรธr triggere.
De to skjermbildene nedenfor viser hva man bรธr vurdere om man skal gjรธre i ulike utlรธserhendelser:
Utlรธsere hรฅndterer sanntidslogikk, men noen jobber er rett og slett for store for en enkelt transaksjon. Det er her batch-Apex kommer inn i bildet.
Batch-klasse i Apex
En batchklasse i Salesforce brukes til รฅ behandle et stort antall poster som ville overskride Apex-styregrensene hvis de ble behandlet normalt. En batchklasse kjรธrer koden asynkront.
Fรธlgende er fordelene med en batchklasse:
- En batchklasse behandler dataene i deler, og hvis รฉn del ikke behandles, blir ikke de vellykkede delene rullet tilbake.
- Hver datadel i en batchklasse behandles med et nytt sett med guvernรธrgrenser, som sikrer at koden kjรธres innenfor guvernรธrens utfรธrelsesgrenser.
Database.Batchable-grensesnittet mรฅ implementeres av en Apex-klasse for รฅ kunne brukes som en batchklasse. Det tilbyr tre metoder som mรฅ implementeres av batchklassen:
1. start()
Denne metoden genererer omfanget av poster eller objekter som skal behandles av grensesnittmetoden execute. Den kalles bare รฉn gang under kjรธringen av batchen. Denne metoden returnerer enten et Database.QueryLocator-objekt eller en Iterable. Antall poster som kan hentes av en SOQL-spรธrring ved hjelp av Database.QueryLocator-objektet er 50 millioner, men ved bruk av en Iterable er det totale antallet poster som kan hentes av SOQL-spรธrringen bare 50 000. En Iterable brukes til รฅ generere et komplekst omfang for batchklassen.
Syntaks for startmetoden:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. utfรธr()
Denne metoden brukes til รฅ behandle hver dataenhet. Utfรธrelsesmetoden kalles for hver dataenhet. Standard batchstรธrrelse for utfรธrelse er 200 poster. Utfรธrelsesmetoden tar to argumenter:
En referanse til Database.BatchableContext-objektet,
En liste over sObjects, for eksempel List , eller en liste over parameteriserte typer. Syntaks for execute-metoden:
global void execute(Database.BatchableContext bc, List<P> records){}
3. ferdig()
Finish-metoden kalles รฉn gang under utfรธrelsen av batchklassen. Etterbehandlingsoperasjoner kan utfรธres i Finish-metoden. For eksempel: sending av en bekreftelses-e-post. Denne metoden kalles nรฅr alle batchene er behandlet. Syntaks for Finish-metoden:
global void finish(Database.BatchableContext bc){}
Database.BatchableContext-objekt
Hver metode i Database.Batchable-grensesnittet har en referanse til et Database.BatchableContext-objekt.
Dette objektet brukes til รฅ track fremdriften til batchjobben.
Fรธlgende er instansmetodene som tilbys av BatchableContext:
- getChildJobId(): Denne metoden returnerer ID-en til batchjobben som behandles.
- getJobId(): Denne metoden returnerer IDen til batchjobben.
Nedenfor er syntaksen til 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 brukes til รฅ kjรธre en batch-klasse.
Denne metoden tar to parametere: en forekomst av batchklassen som skal behandles, og en valgfri omfangsparameter for รฅ spesifisere batchstรธrrelsen. Hvis den ikke er spesifisert, brukes standardstรธrrelsen pรฅ 200.
Syntaks for Database.executeBatch:
Database.executeBatch(myBatchObject, scope)
Utfรธrer en batchklasse kalt MyBatchClass:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Database.Stateful
En batchklasse er som standard tilstandslรธs. Hver gang execute-metoden kalles, mottas en ny kopi av objektet, og alle variablene i klassen initialiseres.
Database.Stateful er implementert for รฅ gjรธre en batchklasse tilstandsfull.
Hvis batchklassen din implementerer Database.Stateful-grensesnitt, alle instansvariablene beholder verdiene sine, men statiske variabler tilbakestilles mellom transaksjoner.
Asynkron Apex Beyond Batch
Batch Apex er bare รฉn av flere mรฅter รฅ kjรธre kode asynkront pรฅ. Salesforce tilbyr fire asynkrone alternativer, og valget av det riktige avhenger av hvor mye data du behandler og om jobber mรฅ kjedes eller planlegges.
- Fremtidige metoder: Disse er annotert med @future, og er best for enkle operasjoner man bare kan avfyre โโog glemme, som for eksempel utkall til eksterne webtjenester.
- Kรธbar Apex: Implementerer Queueable-grensesnittet, godtar komplekse objekttyper, returnerer en jobb-ID og stรธtter kjedekobling av รฉn jobb til en annen.
- Batch Apex: Behandler svรฆrt store datamengder i deler, som beskrevet ovenfor.
- Planlagt topp: Implementerer det planlagte grensesnittet slik at en klasse kjรธrer pรฅ et bestemt tidspunkt, for eksempel en nattlig oppryddingsjobb.
| typen | Best For | Nรธkkelevne |
|---|---|---|
| Fremtidig metode | Enkle oppfordringer | Brann og glem |
| Kรธbar Apex | Sekvensiell prosessering | Jobbkjede og overvรฅking |
| Batch Apex | Millioner av poster | Delvis prosessering |
| Planlagt Apex | Gjentakende jobber | Cron-basert timing |
Uansett hvilken utfรธrelsesmodell du velger, mรฅles hver transaksjon fortsatt mot de plattformomfattende styringsgrensene som er oppfรธrt nedenfor.
Apex-guvernรธrgrenser
Apex-regulatorgrenser er grensene som hรฅndheves av Apex-kjรธretidsmotoren for รฅ sikre at eventuell Apex-kode og -prosesser som ikke fungerer, ikke monopoliserer de delte ressursene og ikke forstyrrer behandlingen til andre brukere i flerleietakermiljรธet. Disse grensene verifiseres mot hver Apex-transaksjon. Fรธlgende er regulatorgrensene som er definert av Salesforce for hver Apex-transaksjon:
| Tekniske beskrivelser | Grense |
|---|---|
| SOQL-spรธrringer som kan gjรธres i en synkron transaksjon | 100 |
| SOQL-spรธrringer som kan utfรธres i en asynkron transaksjon | 200 |
| Poster som kan hentes med en SOQL-spรธrring | 50,000 |
| Poster som kan hentes av Database.getQueryLocator | 10,000 |
| SOSL-spรธrringer som kan utfรธres i en Apex-transaksjon | 20 |
| Poster som kan hentes ved en SOSL-spรธrring | 2,000 |
| DML-setninger som kan gjรธres i en Apex-transaksjon | 150 |
| Poster som kan behandles som et resultat av en DML-setning, Approval.process eller database.emptyRecycleBin | 10,000 |
| Utrop som kan gjรธres i en Apex-transaksjon | 100 |
| Kumulativ tidsavbruddsgrense for alle utrop som utfรธres i en Apex-transaksjon | 120 sekunder |
| Begrensning pรฅ Apex-jobber som kan legges til i kรธen med System.enqueueJob | 50 |
| Utfรธrelsestidsgrense for hver Apex-transaksjon | 10 minutter |
| Begrensning pรฅ tegn som kan brukes i en Apex-klasse og -utlรธser | 1 millioner |
| CPU-tidsgrense for en synkron transaksjon | 10,000 millisekunder |
| CPU-tidsgrense for en asynkron transaksjon | 60,000 millisekunder |
| Total heapstรธrrelse | 6 MB (synkron) / 12 MB (asynkron) |
Slik skriver du en testklasse i Apex
Salesforce krever at minst 75 prosent av Apex-koden din dekkes av enhetstester fรธr du kan distribuere den til produksjon, og hver utlรธser mรฅ ha en viss dekning. ร skrive testklasser er derfor en sentral Apex-ferdighet, ikke et valgfritt tillegg.
En testklasse er annotert med @isTest, og hver testmetode er ogsรฅ merket med @isTest. Testmetoder lagrer ikke data i databasen og ser ikke de fleste eksisterende organisasjonsdata, sรฅ hver test oppretter sine egne poster. Metodene Test.startTest() og Test.stopTest() gir koden som testes et nytt sett med styregrenser, og pรฅstander bekrefter at logikken oppfรธrte seg som forventet.
Her er en enkel testklasse for logikk for kontooppretting:
@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 retningslinjene nรฅr du skriver tester:
- Bruk @testSetup-metoden til รฅ opprette delte testdata รฉn gang for alle testmetodene i klassen.
- Test masseoppfรธrsel ved รฅ sette inn 200 poster, ikke bare รฉn.
- Dekk positive, negative og brukerbegrensede scenarioer.
- Inkluder alltid meningsfulle System.assert-setninger; dekning uten pรฅstander beviser ingenting.
Apex beste praksis
Nybegynnere skriver ofte Apex som fungerer for รฉn post, men som mislykkes i reelle bulkoperasjoner. Fremgangsmรฅtene nedenfor holder koden innenfor kontrollรธrgrensene og er enklere รฅ vedlikeholde:
- Massiviser alt: Skriv logikk som hรฅndterer samlinger av poster, fordi utlรธsere kan motta opptil 200 poster i en enkelt batch.
- Hold SOQL og DML utenfor lรธkker: Spรธr fรธr lรธkken, samle inn endringer i en liste og utfรธr รฉn DML-setning etter lรธkken.
- รn trigger per objekt: Hold utlรธsere logikkfrie og deleger arbeidet til handlerklasser, noe som gjรธr rekkefรธlgen pรฅ utfรธrelse forutsigbar.
- Bruk med deling: Hรฅndhev sikkerhet pรฅ postnivรฅ med mindre det finnes en dokumentert grunn til รฅ kjรธre i systemkontekst.
- Unngรฅ hardkoding av ID-er: Post-ID-er varierer mellom sandkasser og produksjon, sรฅ spรธr etter dem eller bruk tilpassede metadata i stedet.
- Overvรฅk grenser i kode: Metodene i Limits-klassen, som for eksempel Limits.getQueries(), lar deg sjekke ressursforbruket under kjรธretid.
๐ Tips: Kjรธr koden din mot 200 poster i en sandkasse fรธr du distribuerer den. De fleste feil i styresgrenser oppstรฅr bare ved bulkvolum, og det er mye billigere รฅ oppdage dem tidlig enn รฅ feilsรธke dem i produksjon.






