APEX Introduction

 APEX Introduction

It is Object oriented programming language that is used to provide custom code to create business logic and database operation.

APEX is also used to create salesforce triggers that will work automatically , before and after database operation(Insert, Update, Delete).

Apex provide SOQL and SOSL to manage database operation.



📘 Apex Arrays & Collections – Complete Tutorial


1. Introduction

In Apex, data structures are very important because Salesforce apps often deal with records, lists, and sets of data. Apex provides Collections to store and manipulate groups of values or objects.

👉 Collections in Apex:

  1. List (like an Array in Java/C#)

  2. Set

  3. Map

⚡ Note: Unlike Java/C#, there is no fixed-length array in Apex. Instead, List<T> is used as a dynamic array.


2. Arrays in Apex (List<T>)

What is an Array?

An Array (or List) is an ordered collection of elements, indexed starting at 0. You can store primitive types (Integer, String, Boolean), sObjects (Account, Contact, etc.), or custom objects inside it.


Syntax:

List<DataType> listName = new List<DataType>();

Example with Integers:

List<Integer> numbers = new List<Integer>(); numbers.add(10); numbers.add(20); numbers.add(30); System.debug('Array Elements: ' + numbers); System.debug('First element: ' + numbers[0]);

Output

Array Elements: (10, 20, 30) First element: 10

Shortcut Declaration:

List<String> fruits = new List<String>{'Apple','Banana','Mango'}; System.debug(fruits);

Important Methods in List:

MethodDescriptionExample
add(value)Add elementlist.add(50);
add(index,value)Insert at positionlist.add(1,100);
get(index)Get elementlist.get(0);
set(index,value)Replace elementlist.set(1,200);
size()Number of elementslist.size();
isEmpty()Checks if emptylist.isEmpty();
remove(index)Remove elementlist.remove(0);
clear()Remove alllist.clear();
contains(value)Check existencelist.contains('Mango');
clone()Copy listList<String> copy = fruits.clone();

List of sObjects Example:

List<Account> accList = new List<Account>(); // Adding Account records accList.add(new Account(Name='Google')); accList.add(new Account(Name='Amazon')); accList.add(new Account(Name='Microsoft')); insert accList; // Save into Salesforce DB System.debug('Accounts Inserted: ' + accList);

3. Set in Apex

What is Set?

  • Unordered collection of unique elements.

  • Prevents duplicates.

  • Useful in scenarios like removing duplicate IDs, filtering data, etc.

Example:

Set<String> cities = new Set<String>(); cities.add('Indore'); cities.add('Delhi'); cities.add('Indore'); // Duplicate not allowed System.debug(cities); // Output: {Indore, Delhi}

Important Methods:

  • add(value)

  • addAll(list/set)

  • remove(value)

  • contains(value)

  • size()

  • isEmpty()

  • clear()


4. Map in Apex

What is Map?

  • A key-value pair collection.

  • Keys are unique, values can be duplicate.

  • Think of it like a dictionary in Python or HashMap in Java.

Example:

Map<Integer, String> studentMap = new Map<Integer, String>(); studentMap.put(1, 'Rahul'); studentMap.put(2, 'Sneha'); studentMap.put(3, 'Amit'); System.debug(studentMap.get(2)); // Output: Sneha

Map with sObjects:

// Map Account Id with Name Map<Id, String> accMap = new Map<Id, String>(); for(Account acc : [SELECT Id, Name FROM Account LIMIT 5]){ accMap.put(acc.Id, acc.Name); } System.debug('Account Map: ' + accMap);

5. Real-Time Example (Mixing Collections)

👉 Scenario: You want to fetch all Contacts of Accounts and organize them.

// Step 1: Get Accounts List<Account> accList = [SELECT Id, Name FROM Account LIMIT 3]; // Step 2: Store Account IDs in a Set Set<Id> accIds = new Set<Id>(); for(Account acc : accList){ accIds.add(acc.Id); } // Step 3: Query related Contacts using IN List<Contact> conList = [SELECT Id, Name, AccountId FROM Contact WHERE AccountId IN :accIds]; // Step 4: Organize in a Map Map<Id, List<Contact>> accToConMap = new Map<Id, List<Contact>>(); for(Contact con : conList){ if(!accToConMap.containsKey(con.AccountId)){ accToConMap.put(con.AccountId, new List<Contact>()); } accToConMap.get(con.AccountId).add(con); } System.debug(accToConMap);

Apex Asynchronous Examples

In Salesforce, you can write async code in 4 main ways: Future Methods (@future) Batch Apex Queueable Apex
Scheduled Apex 1️⃣ Future Methods – Simple Async Execution Used when you want to run logic in background (e.g., callouts, heavy operations). Example: public class FutureExample { @future public static void sendEmailAsync(String email) { // Mock email sending System.debug('Sending email to: ' + email); } } // Usage from trigger or class FutureExample.sendEmailAsync('student@test.com'); ⚡ Notes: Must be static and void. Accepts only primitive parameters (Id, String, Boolean, etc.). Runs in its own execution thread. 2️⃣ Batch Apex – Process Large Records Used when you need to process millions of records in chunks. Example: global class BatchAccountUpdate implements Database.Batchable<SObject> { global Database.QueryLocator start(Database.BatchableContext bc) { return Database.getQueryLocator('SELECT Id, Name FROM Account'); } global void execute(Database.BatchableContext bc, List<Account> scope) { for(Account acc : scope){ acc.Name = acc.Name + ' - Updated'; } update scope; } global void finish(Database.BatchableContext bc) { System.debug('Batch Completed'); } } // Execute from Anonymous Window BatchAccountUpdate b = new BatchAccountUpdate(); Database.executeBatch(b, 100); // Batch size = 100 ⚡ Notes: start() → fetch records. execute() → logic on each batch. finish() → final action after completion. 3️⃣ Queueable Apex – Advanced Async with Chaining More flexible than @future. You can pass complex types and chain jobs. Example: public class QueueableExample implements Queueable { public void execute(QueueableContext context) { List<Contact> conList = [SELECT Id, LastName FROM Contact LIMIT 10]; for(Contact con : conList){ con.LastName = con.LastName + '_Updated'; } update conList; } } // Execute ID jobId = System.enqueueJob(new QueueableExample()); System.debug('Job ID: ' + jobId); ⚡ Notes: Supports non-primitive params. You can chain jobs like: System.enqueueJob(new QueueableExample()); 4️⃣ Scheduled Apex – Run on Timetable Used for cron jobs (e.g., nightly updates, weekly cleanups). Example: global class ScheduleExample implements Schedulable { global void execute(SchedulableContext sc) { System.debug('Scheduled Job Running...'); } } // Schedule via Setup → Apex Classes → Schedule Apex // OR via code: String cron = '0 0 22 * * ?'; // Every day at 10 PM System.schedule('Nightly Job', cron, new ScheduleExample()); ⚡ Cron Expression Format: Seconds Minutes Hours Day_of_month Month Day_of_week Year(optional) ✅ When to Use What? @future → Quick async, callouts, lightweight jobs. Queueable → Advanced async, chaining, complex params. Batch → Bulk data (millions of records). Schedule → Timed jobs (daily/weekly).

SOQL means salesforce Object Query Language and SOSL means salesforce  object search language,

APEX language syntax is similar to Java programming language, it will compile and execute code using Apex cloud compiler.

Salesforce provide developer option to create APEX class and execute option to execute APEX Code.

Syntax of Apex

public class Classname{

   public static retuntype Methodname() {

  }

  public retuntype Methodname() {

  }

}

Execute Apex code:-


Classname ref = new Classname();

ref.methodname();


Static method means it will store data under class memory that's why it would be call by Classname.

Instance Method means dynamic, it will store data under external memory space that's why first we create memory space using object after that we can call method.

to create dynamic memory space, we will create object.

Classname ref = new Classname();  // it is the syntax object.


ref means address of object, new means memory allocation and Classname() is the constructor that is used to create the memory space.


Now I am creating sample program to differentiate static and dynamic


public class Hello {

  public static void DisplayHello()

  {

      System.debug('hello world');

  }

  public void DisplayHello1()

  {

      System.debug('welcome in salesforce');

  }

}


Press Ctrl + e to open execute window and write followings code.

Hello.DisplayHello();

Hello obj = new Hello();

obj.DisplayHello1();

Now i am creating another program to perform addition and subtraction in APEX class, where addition method is static and subtraction method is dynamic.

Solution:-


public class Operation {

static integer a,b,c;

integer x,y,z;

public static void add()

{

    a=100;

    b=200;

    c=a+b;

    System.debug('result is '+c);

}

public void sub()

{

    x=100;

    y=200;

    z=x-y;

    System.debug('result is '+z);

}

}


Execute this program:-

Operation.add();

Operation obj = new Operation();

obj.sub();


Assignment:-

1)  Manage Employee Information with empid, empname, job, salary, joingdate, experience, dateofbirth with respective data type.

public class Employee {

private integer empid;

private string empname;

private string job;

private integer salary;

private double experience;

private date dob;

private date joiningdate;


public void Accept(integer empid,string empname,string job,integer salary,double experience,date dob,date joiningdate)

{

    this.empid=empid;

    this.empname=empname;

    this.job=job;

    this.salary=salary;

    this.experience=experience;

    this.dob=dob;

    this.joiningdate=joiningdate;

}


public void Display()

{

    System.debug('empid is '+empid + ' name is '+empname + ' job is '+job + 'salary is '+salary + 'experience is '+experience + ' dob is '+dob + ' Joining date is '+ joiningdate);

}

    

}


How to call it:-


Employee obj = new Employee();

obj.Accept(1001,'emp1','cleark',45000,2.5d,date.valueOf('1992-12-12'),date.valueOf('1992-12-12'));

obj.Display();


2)  Calculate Simple Interest using APEX Class

3)  WAP to swap two different numbers?

SOSL Query:


🔹 1️⃣ Search by Exact Keyword in All Fields

FIND 'Lucknow' IN ALL FIELDS RETURNING Branch__c(Id, Name)

🔍 Searches for the word “Lucknow” anywhere in all searchable fields of Branch__c.


🔹 2️⃣ Search by Prefix (Wildcard at End)

FIND 'Acc*' IN NAME FIELDS RETURNING Account(Id, Name)

🔍 Finds all Accounts whose Name starts with “Acc” (like “Accenture”, “AccountPro”).


🔹 3️⃣ Search by Suffix (Wildcard at Start)

FIND '*tech' IN ALL FIELDS RETURNING Account(Id, Name)

🔍 Finds records ending with “tech” (like “Innotech”, “Hightech”).


🔹 4️⃣ Search by Exact Phrase

FIND '"Sales Manager"' IN ALL FIELDS RETURNING Contact(Id, Name, Title)

🔍 Finds Contacts whose Title or other text fields contain the exact phrase “Sales Manager”.


🔹 5️⃣ Search Using Logical Operators

FIND 'Developer OR Tester' IN ALL FIELDS RETURNING Employee__c(Id, Name, Role__c)

🔍 Returns all employees who have either “Developer” or “Tester” in searchable fields.


🔹 6️⃣ Search Across Multiple Objects

FIND 'Delhi' IN ALL FIELDS RETURNING Branch__c(Id, Name), Account(Id, Name), Contact(Id, FirstName, LastName)

🔍 Searches Delhi in Branch__c, Account, and Contact — all at once.


🔹 7️⃣ Limit and Order Results

FIND 'Salesforce' IN ALL FIELDS RETURNING Course__c(Id, Name ORDER BY Name LIMIT 5), Student__c(Id, Name LIMIT 3)

🔍 Returns top 5 matching courses and top 3 students.


🔹 8️⃣ Use SOSL with Apex Variable (Bind Variable)

String searchKey = 'Python'; List<List<SObject>> results = [ FIND :searchKey IN ALL FIELDS RETURNING Course__c(Id, Name, Duration__c) ];

String a='Lucknow'; List<List<SObject>> lst = [ FIND :a IN ALL FIELDS RETURNING Branch__c(Id, Name) ]; // Extract the list of Branch__c records from the SOSL result List<Branch__c> branchList = (List<Branch__c>) lst[0]; // Check if any records were found if (branchList.isEmpty()) { System.debug('⚠️ No branches found for Lucknow.'); } else { System.debug('✅ Branches found: ' + branchList.size()); // Loop through the results and display each record for (Branch__c branch : branchList) { System.debug('Branch Id: ' + branch.Id + ', Branch Name: ' + branch.Name); } }

🔍 Uses a dynamic variable searchKey in Apex.


🔹 9️⃣ Use Wildcard to Return “All” Records with Text

FIND '*' IN ALL FIELDS RETURNING Branch__c(Id, Name)

🔍 Returns all Branch__c records that contain any text in searchable fields.


🔹 🔟 Use FIND with Specific Field Scope

FIND 'john@example.com' IN EMAIL FIELDS RETURNING Contact(Id, FirstName, LastName, Email)

🔍 Searches only email fields for the given email address.


🧩 Bonus — Combined Example in Apex

List<List<SObject>> searchList = [ FIND 'Salesforce' IN ALL FIELDS RETURNING Course__c(Id, Name, Duration__c), Student__c(Id, Name, Email__c), Trainer__c(Id, Name, Expertise__c) ]; List<Course__c> courses = (List<Course__c>) searchList[0]; List<Student__c> students = (List<Student__c>) searchList[1]; List<Trainer__c> trainers = (List<Trainer__c>) searchList[2]; System.debug('Courses found: ' + courses.size()); System.debug('Students found: ' + students.size()); System.debug('Trainers found: ' + trainers.size());

String a='Lucknow'; List<List<SObject>> lst = [ FIND :a IN ALL FIELDS RETURNING Branch__c(Id, Name),Course__c(Id,Name) ]; // Extract the list of Branch__c records from the SOSL result List<Branch__c> branchList = (List<Branch__c>) lst[0]; List<Course__c> cList = (List<Course__c>) lst[1]; // Check if any records were found if (branchList.isEmpty()) { System.debug('⚠️ No branches found for Lucknow.'); } else { System.debug('✅ Branches found: ' + branchList.size() + ' Courses Found' + cList.size()); // Loop through the results and display each record for (Branch__c branch : branchList) { System.debug('Branch Id: ' + branch.Id + ', Branch Name: ' + branch.Name); } for (Course__c c : cList) { System.debug('Course Id: ' + c.Id + ', Course Name: ' + c.Name); } }


What is Group by & Having in SOQL:

Group By Clause:

it is used to logically subdivide the table data into multiple subgroup based on column.

group column  should not be primary and unique key because for grouping duplicate data is required.

in case of group we can select only group column or aggregate function.

Student
rno name coursename
1   st   java
2   st1  apex
3   st2  java
4   st4  apex
5   st5  js

.........................

I want to display coursenme and number of student.

select coursename,count(*) from student group by coursename;


having: it is used to apply condition after group by then we prefer Having clause

Get course which contains more than two students exclude java course.

select coursename,count(*) from student where coursename!=java group by coursename having count(*)>2;

Get course which contains more than two students exclude java course and display in asc order based on coursename.

select coursename,count(*) from student where coursename!=java group by coursename having count(*)>2 order by coursename;


Example in Apex:
List<AggregateResult> st =[Select coursename__c,count(Id) total 
                           from stugroup__c 
                           where coursename__c!='java' 
                           group by coursename__c
                           having count(Id)>=1
                           order by coursename__c desc];
for(AggregateResult o:st)
{
    System.debug(o.get('coursename__c') + ','+o.get('total'));
}



APEX Join:

APEX or SOQL not support SQL style join , because it provide relationship between objects without this salesforce not provide object implementation.

Salesforce has two relationship 
1) parent to child:

   We will use subquery to get child record from parent record.

e.g Account is the parent object and Contact is the child object , we can directly get data of contact under Account object.

List<Account> acc = [select Id,Name, (Select Id,Name from Contacts) from Account Limit 10];

for(Account o:acc)
{
   System.debug('Account info'+ o.Id + ','+o.Name);
   for(Contact c:o.Contacts)
   {
      System.debug('contact info' + c.Id + ','+c.Name);

   }
}





2) child to parent:

it is basically used to implement join operation from many to one relationship.


e.g we have Account and Contact object and we want to get data from contact object to account then we use this.

List<Contact> obj = [Select Id,Name, Account.Name from Contact];
for(Contact c:obj)
{
    System.debug(' Person Name' + c.Name + ' Account Name' + C.Account.Name);
}


🧠 


Quick Summary of Common Scopes

ScopeDescription
IN ALL FIELDSSearches all searchable fields
IN NAME FIELDSOnly in name-type fields (Account.Name, Contact.Name)
IN EMAIL FIELDSOnly email fields
IN PHONE FIELDSOnly phone fields
IN SIDEBAR FIELDSSame as global search scope

Read about What is Salesforce?




Post a Comment

0 Comments