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.

  • ๐Ÿงฑ Foundation: Apex er et sprog, der ikke skelner mellem store og smรฅ bogstaver, med Java-lignende syntaks, der kรธrer native pรฅ Salesforce Lightning-platformen.
  • ๐Ÿ—ƒ๏ธ Dataadgang: SOQL-forespรธrgsler og DML-sรฆtninger lader din kode lรฆse og skrive sObject-poster direkte i Salesforce-databasen.
  • ๐Ÿ› ๏ธ Gennemfรธrelse: Klasser, egenskaber og udlรธsere knytter brugerdefineret logik til indsรฆttelser, opdateringer, sletninger og andre systemhรฆndelser af poster.
  • ๐Ÿ“ฆ Skala: Batch Apex og andre asynkrone muligheder behandler millioner af poster i chunks uden at overskride platformens grรฆnser.
  • ๐Ÿšฆ Guvernรธrgrรฆnser: Begrรฆnsninger pr. transaktion, f.eks. 100 synkrone SOQL-forespรธrgsler og 150 DML-sรฆtninger, beskytter delte ressourcer.
  • โœ… Kvalitet: Enhedstests skal dรฆkke mindst 75 procent af Apex-koden fรธr produktionsimplementering.

Oversigt over APEX Salesforce-programmering

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:

Arbejdsstruktur af Apex

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 udviklingsmiljรธ

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:

Apex Trigger Kontekstvariabler

Apex Trigger Kontekstvariabler (fortsat)

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:

Overvejelser vedrรธrende Apex-udlรธserhรฆndelser

Overvejelser vedrรธrende Apex Trigger-hรฆndelser (fortsat)

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.

Ofte Stillede Spรธrgsmรฅl

Nej. Apex lรฅner Java-lignende syntaks, men den skelner ikke mellem store og smรฅ bogstaver, kรธrer kun pรฅ Salesforce Lightning-platformen, integrerer SOQL direkte i sproget og styres af grรฆnser pr. transaktion, der Java har ikke.

Tilmeld dig en gratis Salesforce Developer Edition-organisation, som inkluderer Developer Console, og fรธlg praktiske รธvelser pรฅ stihoved, den officielle lรฆringsplatform fra Salesforce.

Visualforce er et markup-sprog til at bygge brugergrรฆnsefladesider, mens Apex er det serversidesprog, der leverer logikken bag dem. Visualforce-sider kalder ofte Apex-controllerklasser for at forespรธrge og opdatere data.

Ja. Agentforce for udviklere, AI-assistenten fra Salesforce for Visual Studio Code, genererer og forklarer Apex ud fra naturligt sproglige prompter. Gennemgรฅ og test altid AI-genereret kode mod governor-grรฆnser fรธr implementering.

Apex-klasser markeret med annotationen @InvocableMethod kan eksponeres som brugerdefinerede handlinger, hvilket giver Einstein-bots og Agentforce-agenter mulighed for at kalde din forretningslogik, mens Apex ogsรฅ kan kalde Einstein-promptskabeloner og AI-modeller via platform-API'er.

Opsummer dette indlรฆg med: