APEX Handledning: Apex programmeringsklass och kodningsexempel

Vad är Apex i Salesforce?

Apex är ett objektorienterat och starkt typat programmeringsspråk utvecklat av Salesforce för att bygga Software as a Service (SaaS) och Customer Relationship Management (CRM). Apex hjälper utvecklare att skapa SaaS-applikationer från tredje part och lägga till affärslogik till systemhändelser genom att tillhandahålla back-end-databasstöd och klient-servergränssnitt.

Apex hjälper utvecklare att lägga till affärslogik till systemhändelser som knappklick, relaterade postuppdateringar och Visualforce-sidor. Apex har en liknande syntax som Java. Registrera dig för Salesforce för att lära dig hur CRM fungerar

Funktioner i Apex programmeringsspråk

Här är de viktiga funktionerna i Salesforce Apex:

  • Apex är ett skiftlägesokänsligt språk.
  • Du kan utföra DML-operationer som INSERT, UPDATE, UPSERT, DELETE på sObject-poster med apex.
  • Du kan fråga efter sObject-poster med SOQL(salesforce object query language) och SOSL(salesforce object search language) i apex.
  • Låter dig skapa en enhetstest och kör dem för att verifiera kod täckning och effektiviteten av koden i apex.
  • Apex körs i en miljö med flera hyresgäster, och Salesforce har definierat några regulatorgränser som hindrar en användare från att kontrollera de delade resurserna. Alla koder som passerar salesforces guvernörsgräns misslyckas, ett fel dyker upp.
  • Salesforce-objekt kan användas som en datatyp i apex. Till exempel -
    Account acc = new Account();

    , här är Account ett standardobjekt i salesforce.

  • Apex uppgraderas automatiskt med varje Salesforce-version.

När ska utvecklaren välja Apex

Apex-kod bör endast skrivas om ett affärsscenario är för komplext och inte kan implementeras med den förbyggda funktionaliteten som tillhandahålls av Salesforce.

Följande är några scenarier där vi behöver skriva apex-kod:

  • Att skapa webbtjänster som integrerar Salesforce med andra applikationer.
  • Att implementera anpassad validering på sobjects.
  • För att utföra anpassad apex-logik när en DML-operation utförs.
  • Att implementera funktionalitet som inte kan implementeras med hjälp av befintliga arbetsflöden och processbyggares funktionalitet.
  • Att ställa in e-posttjänstermåste du inkludera bearbetning av innehåll, rubriker och bilagor i e-postmeddelanden med hjälp av apex-kod.

Arbetsstruktur av Apex

Nu i denna Apex-handledning kommer vi att lära oss om arbetsstrukturen för Apex:

Följande är flödet av åtgärder för en apex-kod:

  • Utvecklaråtgärd: All apex-kod som skrivits av en utvecklare kompileras till en uppsättning instruktioner som kan förstås av apex runtime-tolk när utvecklaren sparar koden på plattformen och dessa instruktioner sedan sparas som metadata till plattformen.
  • Slutanvändaråtgärd: När användarhändelsen kör en apex-kod får plattformsservern de kompilerade instruktionerna från metadata och kör dem genom apex-tolken innan resultatet returneras.
Arbetsstruktur av Apex
Arbetsstruktur av Apex

Apex syntax

Variabel deklaration

Eftersom apex är ett starkt skrivet språk är det obligatoriskt att deklarera en variabel med datatyp i apex.

Till exempel:

contact con = new contact(); 

här deklareras variabeln con med kontakt som datatyp.

SOQL-fråga

SOQL står för salesforce object query language. SOQL används för att hämta sObject-poster från Salesforce-databasen. Till exempel-

Account acc = [select id, name from Account Limit 1]; 

Ovanstående fråga hämtar kontopost från salesforce-databasen.

Loop Statement

Loop-satsen används för att iterera över posterna i en lista. Antalet iterationer är lika med antalet poster i listan. Till exempel:

list<Account>listOfAccounts = [select id, name from account limit 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
	//your logic
}

I kodavsnittet ovan är listOfAccounts en variabel av listdatatypen.

Flödeskontrolldeklaration

Flödeskontrollsats är fördelaktig när du vill exekvera några rader i koden baserat på vissa villkor.

Till exempel:

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
}

Ovanstående kodavsnitt söker efter kontoposter från databasen och kontrollerar liststorleken.

DML uttalande

DML står för data manipulation language. DML-satser används för att manipulera data i Salesforce-databasen. Till exempel -

Account acc = new Account(Name = ‘ Test Account’);
Insert acc; //DML statement to create account record.

Apex utvecklingsmiljö

Nu i denna Apex-programmeringshandledning kommer vi att lära oss om Apex Development Environment:

Apex-kod kan utvecklas antingen i sandbox och utvecklarversionen av Salesforce.

Det är en bästa praxis att utveckla koden i sandlådemiljön och sedan distribuera den till produktionsmiljön.

Apex utvecklingsmiljö

Apex-kodutvecklingsverktyg: Följande är de tre verktyg som är tillgängliga för att utveckla apex-kod i alla utgåvor av Salesforce.

  • Force.com utvecklarkonsol
  • Force.com IDE
  • Code Editor i Salesforce User InterfaceYou

Datatyp i Apex

Följande är datatyperna som stöds av apex:

Primitiv

Heltal Double, Long, Date, Date Time, String, ID och Boolean betraktas som primitiva datatyper. Alla primitiva datatyper skickas med värde, inte genom referens.

Kollektioner

Tre typer av samling finns i Apex

  • Lista: Det är en ordnad samling av primitiver, sObjects, samlingar eller Apex-objekt baserat på index.
  • Set: En oordnad samling av unika primitiver.
  • Karta: Det är en samling av unika, primitiva nycklar som mappar till enskilda värden som kan vara primitiva, sObjects, samlingar eller Apex-objekt.

sObjekt

Detta är en speciell datatyp i Salesforce. Det liknar ett bord i SQL och innehåller fält som liknar kolumner i SQL.

Enums

Enum är en abstrakt datatyp som lagrar ett värde av en ändlig uppsättning av specificerade identifierare

Klasser

Objekt

Det hänvisar till alla datatyper som stöds i Apex.

Gränssnitt

Apex Access Specifier

Följande är åtkomstspecifikationen som stöds av apex:

offentliga

Denna åtkomstspecifikator ger tillgång till en klass, metod, variabel som ska användas av en apex inom ett namnområde.

Privat

Denna åtkomstspecifikator ger tillgång till en klass, metod, variabel som ska användas lokalt eller inom kodsektionen, den är definierad. All teknik, variabler som inte har någon åtkomstspecifikation definierad har standardåtkomstspecifikationen privat.

Skyddad

Denna åtkomstspecifikation ger tillgång till en metod, variabel som ska användas av alla inre klasser inom definierande Apex-klass.

Välgörenhet

Denna åtkomstspecifikator ger tillgång till en klass, metod, variabel som ska användas av en apex inom ett namnområde såväl som utanför namnområdet. Det är en bästa praxis att inte använda globala sökord förrän det är nödvändigt.

Nyckelord i Apex

Med delning

Om en klass definieras med detta nyckelord, tillämpas alla delningsregler för den aktuella användaren och om detta nyckelord saknas, körs koden under systemkontext.

Till exempel:

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

Utan att dela

Om en klass definieras med detta nyckelord, tillämpas inte alla delningsregler för den aktuella användaren.

Till exempel:

public without sharing class MyApexClass{
// sharing rules is not enforced when code in this class execute
}

Statisk

En variabel, Method definieras med det statiska nyckelordet initieras en gång och associeras med klassen. Statiska variabler, metoder kan anropas med klassnamn direkt utan att skapa instansen av en klass.

Slutlig

En konstant, Metod definieras med det sista nyckelordet som inte kan åsidosättas. Till exempel:

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

Om du försöker åsidosätta värdet för denna INT_CONST-variabel, får du ett undantag – System.FinalException: Den slutliga variabeln har redan initierats.

Retur

Detta nyckelord returnerar ett värde från en metod. Till exempel:

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

Null

Den definierar en nollkonstant och kan tilldelas en variabel. Till exempel

 Boolean b = null;

Virtuell

Om en klass definieras med ett virtuellt nyckelord kan den utökas och åsidosättas.

Abstrakt

Om en klass definieras med abstrakt nyckelord måste den innehålla minst en metod med nyckelord abstrakt, och den metoden ska bara ha en signatur.

Till exempel

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

Apex sträng

En sträng är en uppsättning tecken utan teckenbegränsningar. Till exempel:

String name = 'Test';

Det finns flera inbyggda metoder som tillhandahålls av String-klass i salesforce. Följande är de få ofta och mest använda funktionerna:

förkorta (maxWidth)

Denna metod trunkerar en sträng till den angivna längden och returnerar den om längden på den givna strängen är längre än den angivna längden; annars returneras den ursprungliga strängen. Om värdet för variabeln maxWidth är mindre än 4, returnerar den här metoden ett runtime-undantag – System.StringException: Minsta förkortningsbredd är 4

Till exempel:

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

kapitalisera()

Denna metod konverterar den första bokstaven i en sträng till skiftläge och returnerar den.

Till exempel:

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

innehåller (delsträng)

Denna metod returnerar true om strängen som anropar metoden innehåller den angivna delsträngen.

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

lika(stringOrId)

Denna metod returnerar true om parametern som skickas inte är null och indikerar samma binära teckensekvens som strängen som anropar metoden.

När man jämför Id-värden kanske längden på ID:n inte är lika. Till exempel: om en sträng som representerar 15 tecken id jämförs med ett objekt som representerar 18 tecken ID returnerar denna metod true. Till exempel:

Id idValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result4 = stringValue15.equals(IdValue18);
System.debug('result4', +result4); //true

I exemplet ovan jämför metoden 15 tecken objekt Id med 18 tecken objekt Id och om båda dessa id representerar samma binära sekvens kommer det att returnera sant.

Använd den här metoden för att göra skiftlägeskänsliga jämförelser.

escapeSingle Quotes(stringToEscape)

Den här metoden lägger till ett escape-tecken (\) före varje enskilt citattecken i en sträng och returnerar det. Den här metoden förhindrar SOQL-injektion samtidigt som en dynamisk SOQL-fråga skapas. Denna metod säkerställer att alla enkla citattecken betraktas som omslutande strängar, istället för databaskommandon.

Till exempel:

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

remove(substring)

Denna metod tar bort all förekomst av den nämnda delsträngen från strängen som anropar metoden och returnerar den resulterande strängen.

Till exempel

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

delsträng (startindex)

Denna metod returnerar en delsträng som börjar från tecknet vid startIndex sträcker sig till den sista av strängen.

Till exempel:

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

omvänd()

Denna metod vänder alla tecken i en sträng och returnerar den. Till exempel:

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

trim(): Denna metod tar bort alla inledande vita blanksteg från en sträng och returnerar den.

valueOf(toConvert)

Denna metod returnerar strängrepresentationen av passerat i objekt.

Apex Governor Limits

Apex guvernörsgränser är de gränser som upprätthålls av apex runtime-motor för att säkerställa att all startbanas apex-kod och processer inte kontrollerar de delade resurserna och inte bryter mot bearbetningen för andra användare i multitenant-miljön. Dessa gränser verifieras mot varje apex-transaktion. Följande är guvernörsgränserna definierade av salesforce för varje apex-transaktion:

Description Begränsa
SOQL-frågor som kan göras i en synkron transaktion 100
SOQL-frågor som kan göras i en asynkron transaktion 200
Poster som kan hämtas med en SOQL-fråga 50000
Poster som kan hämtas av Database.getQueryLocator 10000
SOSL-frågor som kan göras i en apex-transaktion 20
Poster som kan hämtas med en SOSL-fråga 2000
DML-satser som kan göras i en apex-transaktion 150
Poster som kan bearbetas som ett resultat av en DML-sats, Approval.process eller database.emptyRecycleBin 10000
Förklaringar som kan göras i en apex-transaktion. 100
Kumulativ timeout-gräns för alla callouts som utförs i en apex-transaktion 120 sekunder
Begränsning av apex-jobb som kan läggas till i kön med System.enqueueJob 50
Utförandetidsgräns för varje Apex-transaktion 10 minuter
Begränsa antalet tecken som kan användas i en apexklass och trigger 1 miljoner
CPU tidsgräns för synkron transaktion 10,000 millisekunder
CPU tidsgräns för asynkron transaktion 60,000 millisekunder

Apex Getter och Setter

Apex-egenskapen liknar apex-variabeln. Getter och setter är nödvändiga för en apex-egenskap. Getter och setter kan användas för att exekvera kod innan egenskapsvärdet nås eller ändras. Koden i get-accessorn körs när ett egenskapsvärde läses. Koden i setaccessorn körs när ett egenskapsvärde ändras. Varje egendom som har get accessor anses vara skrivskyddad, varje egenskap som har set accessor anses skriva endast vilken egenskap som har både get och set accessor anses vara läs-skriv. Syntax för en apex-egenskap:

public class myApexClass {
// Property declaration
	access_modifierreturn_typeproperty_name {
	get {
			//code  
		}
		set{
			//code
		}
	}

Här är access_modifier åtkomstmodifieraren för egenskapen. return_type är egenskapens dataType. egenskapsnamn är namnet på egenskapen.

Nedan är ett exempel på en apex-egenskap som har både get- och set-accessor.

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

Här är egenskapens namn namn, och det är offentlig egendom, och det returnerar en sträng dataType.

Det är inte obligatoriskt att ha någon kod i get and set-blocket. Dessa block kan lämnas tomma för att definiera en automatisk egenskap. Till exempel:

public double MyReadWriteProp{ get; set; } 

Get and set accessor kan också definieras med deras åtkomstmodifierare. Om en accessor är definierad med en modifierare åsidosätter den åtkomstmodifieraren för egenskapen. Till exempel:

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

Apex klass

En apexklass är en ritning eller mall från vilken objekt skapas. Ett objekt är instansen av en klass.

Det finns tre sätt att skapa apex-klasser i Salesforce:

Utvecklarkonsol

Force.com IDE

Apex klass detaljsida.

I apex kan du definiera en yttre klass även kallad toppnivåklass, och du kan även definiera klasser inom en yttre klass som kallas inre klasser.

Det är obligatoriskt att använda åtkomstmodifierare som global eller public i deklarationen för den yttre klassen.

Det är inte nödvändigt att använda åtkomstmodifierare i deklarationen av inre klasser.

En apex-klass definieras med hjälp av klass nyckelord följt av klassnamnet.

Extends nyckelord används för att utöka en befintlig klass med en apexklass, och implements nyckelord används för att implementera ett gränssnitt med en apexklass.

Salesforce Apex stöder inte flera arv, en apexklass kan bara utöka en befintlig apexklass men kan implementera flera gränssnitt.

En apex-klass kan innehålla användardefinierad konstruktor, och om en användardefinierad konstruktor inte är tillgänglig används en standardkonstruktor. Koden i en konstruktor körs när en instans av en klass skapas.

Syntax för Apex Class-exemplet:

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

Det nya nyckelordet används för att skapa en instans av en apexklass. Nedan finns syntaxen för att skapa en instans av en apexklass.

myApexClass obj = new myApexClass();

Apex trigger

Apex-utlösare gör att du kan köra anpassad apex före och efter att en DML-operation utförs.

Apex-stöd efter två typer av triggers:

Före triggers: Dessa triggers används för att validera och uppdatera fältets värde innan posten sparas i databasen.

Efter triggers: Dessa triggers används för att komma åt fälten (post-ID, LastModifiedDate-fält) som ställts in av systemet efter en post som har anslutits till databasen. Dessa fältvärden kan användas för att ändra andra poster. Poster som aktiveras efter utlösare är skrivskyddade.

Det är en bästa praxis att skriva skrymmande triggers. En skrymmande utlösare kan bearbeta en enskild post såväl som flera poster samtidigt.

Syntax för en apex-utlösare:

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

Här är TriggerName namnet på triggern, ObjectName är namnet på objektet som triggern ska skrivas på, trigger_events är den kommaseparerade listan över händelser.

Följande är händelserna som stöds av apex-utlösare: före infogning, före uppdatering, före radering, efter infogning, efter en uppdatering, efter borttagning, efter återställ.

Statiska nyckelord kan inte användas i en Apex-utlösare. Alla nyckelord som är tillämpliga på inre klasser kan användas i en Apex-utlösare.

Det finns implicita variabler som definieras av varje trigger som returnerar körtidskontexten. Dessa variabler definieras i systemet. Triggerklass. Dessa variabler kallas kontextvariabler. Skärmbilden nedan visar kontextvariabeln som stöds av apex trigger.

Apex trigger

Apex trigger

Följande är övervägandet av kontextvariabeln i apex-utlösaren:

  • Använd inte trigger.new och trigger.old i DML-operationer.
  • Trigger.new kan inte raderas.
  • Trigger.new är skrivskyddat.
  • Trigger.new kan användas för att ändra värdena för fälten på samma objekt i enbart före trigger.

Nedan skärmdumpar listar överväganden om specifika åtgärder i olika triggerhändelser.

Apex trigger

Apex trigger

Batchklass i Apex

Batchklass i salesforce används för att bearbeta ett stort antal poster som skulle överskrida gränsvärdena för apex-guvernören om de bearbetades normalt. Batch-klassen exekverar koden asynkront.

Följande är fördelarna med batchklass:

  • Batchklass bearbetar data i bitar och om en bit misslyckas med att bearbeta framgångsrikt rullar inte alla bitar som bearbetats med framgång tillbaka.
  • Varje bit data i en batchklass bearbetas med en ny uppsättning regulatorgränser som säkerställer att koden körs inom regulatorns exekveringsgränser.
  • Databas. Batchbart gränssnitt måste implementeras av en apexklass för att användas som en batchklass. Den tillhandahåller tre metoder som måste implementeras av batchklassen.

Följande är de tre metoderna som tillhandahålls av Database. Batchbart gränssnitt:

1.start()

Denna metod genererar omfattningen av poster eller objekt som ska bearbetas av gränssnittsmetoden execute. Under körningen av batch anropas den endast en gång. Denna metod returnerar antingen ett Database.QueryLocator-objekt eller ett Iterable. Antalet poster som hämtas av SQL-frågan med Database.QueryLocator-objektet är 50 miljoner poster, men med en iterabel är det totala antalet poster som kan hämtas av SQL-frågan endast 50000 XNUMX. Iterable används för att generera komplext omfång för batchklass.

Syntax för startmetoden:

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

2.execute()

Denna metod används för bearbetning av varje databit. För varje bit av poster anropas exekveringsmetoden. Standardbatchstorleken för exekvering är 200 poster. Körmetoden tar två argument:

En referens till Database.BatchableContext-objektet,

En lista med sObjekt, till exempel List , eller en lista över parametriserade typer. Syntax för exekveringsmetod:

global void execute(Database.BatchableContext BC, list<P>){}

3.finish()

Slutmetoden anropas en gång under körningen av batchklassen. Efterbehandlingsoperationer kan utföras i finishmetoden. Till exempel: skicka bekräftelsemailet. Denna metod anropas när all batch bearbetas. Syntax för Finish-metoden:

global void finish(Database.BatchableContext BC){}

Database.BatchableContext-objekt

Varje metod i databasen. Batchable gränssnitt har en referens till Database.BatchableContext objekt.

Detta objekt används för att spåra batchjobbets förlopp.

Följande är instansmetoder som tillhandahålls av BatchableContext:

  • getChildJobId(): Denna metod returnerar ID:t för ett batchjobb som för närvarande bearbetas.
  • getJobId(): Denna metod returnerar batchjobbets ID.

Nedan är syntaxen för en batchklass:

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

Database.executeBatch-metod

Metoden Database.executeBatch används för att köra en batchklass.

Den här metoden kräver två parametrar: Förekomst av batchklassen som ska bearbetas, Options-parametern för att ange batchstorleken om den inte anges, den tar standardstorleken 200.

Syntax för Database.executeBatch :

Database.executeBatch(myBatchObject,scope)

Exekvera ett batchklassnamn MyBatchClass:

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

Databas.stateful

Batchklassen är tillståndslös som standard. Varje gång exekveringsmetoden kallas en ny kopia av ett objekt tas emot, initieras alla variabler i klassen.

Database.stateful implementeras för att göra en batchklass tillståndsfull.

Om din batchklass implementerade Databas , statiskt gränssnitt behåller alla instansvariabler sina värden, men de statiska variablerna återställs mellan transaktionerna.

Sammanfattning

  • Apex är en starkt typad, objektorienterad programmeringsspråk som kompilerar och körs på force.com-plattformen
  • Apex programmeringsspråk är ett skiftlägesokänsligt språk
  • Två typer av flöde av åtgärder i Apex är 1) Utvecklaråtgärd 2) Slutanvändaråtgärd
  • Apex hjälper dig att skapa webbtjänster som integrerar Salesforce med andra applikationer.
  • Datatyper som stöds av apex är: 1).Primitiva 2) Samlingar 3) sObject, Enums, 4) Klasser, 5) Objekt och gränssnitt
  • Public, Private, Protected och Global specificeras av Apex
  • Nyckelord som används i Apex är: 1) Med delning, 2) Utan delning, 3) Statisk, 4) Slutlig 5) Retur, 6) Null, 7) Virtuell, 8) Abstrakt
  • En sträng är en uppsättning tecken utan teckenbegränsningar
  • Apex-guvernörsgränser är de gränser som upprätthålls av apex-runtime-motorn för att säkerställa att all start- och landningsbanas apex-kod och processer
  • Getter och setter kan användas för att exekvera kod innan egenskapsvärdet nås eller ändras
  • Det finns tre sätt att skapa apex-klasser i Salesforce: 1)Utvecklarkonsol 2)Force.com IDE och 3) Apex-klassdetaljer.
  • Apex-utlösare gör att du kan köra anpassad apex före och efter att en DML-operation utförs.
  • Batchklass i salesforce används för att bearbeta ett stort antal poster som skulle överskrida gränsvärdena för apex-guvernören om de bearbetades normalt.