Tutorial Salesforce Apex untuk Pemula

⚡ Ringkasan Cerdas

Pemrograman Apex memberi pengembang Salesforce bahasa berorientasi objek dan bertipe kuat untuk menambahkan logika bisnis kustom ke CRM. Bahasa ini mendukung kelas, pemicu, dan pekerjaan batch, sementara batasan governor menjaga platform multi-tenant bersama tetap stabil.

  • 🧱 Foundation: Apex adalah bahasa yang tidak peka terhadap huruf besar/kecil. Java-sintaks yang mirip yang berjalan secara native di Salesforce Lightning Platform.
  • ️ Akses data: Kueri SOQL dan pernyataan DML memungkinkan kode Anda untuk membaca dan menulis catatan sObject langsung di basis data Salesforce.
  • ️ Implementasi: Kelas, properti, dan pemicu melampirkan logika khusus ke penyisipan, pembaruan, penghapusan data, dan peristiwa sistem lainnya.
  • 📦 Skala: Batch Apex dan opsi asinkron lainnya memproses jutaan data secara bertahap tanpa melanggar batasan platform.
  • 🚦 Batasan Gubernur: Batasan per transaksi, seperti 100 kueri SOQL sinkron dan 150 pernyataan DML, melindungi sumber daya bersama.
  • ✅ Kualitas: Pengujian unit harus mencakup setidaknya 75 persen kode Apex sebelum diterapkan ke lingkungan produksi.

Gambaran Umum Pemrograman APEX Salesforce

Apa itu Apex di Salesforce?

puncak Apex adalah bahasa pemrograman berorientasi objek dan bertipe kuat yang dikembangkan oleh Salesforce untuk membangun aplikasi Software as a Service (SaaS) dan Customer Relationship Management (CRM). Apex membantu pengembang membuat aplikasi SaaS pihak ketiga dan menambahkan logika bisnis ke peristiwa sistem dengan menyediakan dukungan basis data back-end dan antarmuka klien-server.

Apex membantu pengembang menambahkan logika bisnis ke peristiwa sistem seperti klik tombol, pembaruan catatan terkait, dan halaman Visualforce. Apex memiliki sintaks yang mirip dengan Java. Daftar ke Tenaga Penjualan untuk mempelajari cara kerja CRM.

Fitur Bahasa Pemrograman Apex

Berikut adalah fitur penting Salesforce Apex:

  • Apex adalah bahasa yang tidak peka terhadap huruf besar dan kecil.
  • Anda dapat melakukan operasi DML seperti INSERT, UPDATE, UPSERT, dan DELETE pada record sObject menggunakan Apex.
  • Anda dapat melakukan kueri catatan sObject menggunakan SOQL (Salesforce Object Query Language) dan SOSL (Salesforce Object Search Language) di Apex.
  • Memungkinkan Anda membuat tes unit dan jalankan untuk memverifikasinya cakupan kode dan efisiensi kode di Apex.
  • Apex dijalankan di lingkungan multi-penyewa, dan Salesforce Salesforce telah menetapkan batasan governor yang mencegah pengguna memonopoli sumber daya bersama. Kode apa pun yang melampaui batasan governor Salesforce akan gagal, dan pesan kesalahan akan muncul.
  • Objek Salesforce dapat digunakan sebagai tipe data di Apex. Misalnya:
    Account acc = new Account();

    Di sini, Account adalah objek standar Salesforce.

  • Apex secara otomatis ditingkatkan pada setiap rilis Salesforce.

Kapan Sebaiknya Pengembang Memilih Apex?

Kode Apex sebaiknya hanya ditulis jika skenario bisnis terlalu kompleks untuk diimplementasikan menggunakan fungsionalitas bawaan yang mudah digunakan yang disediakan oleh Salesforce.

Berikut adalah beberapa skenario di mana Anda perlu menulis kode Apex:

  • Untuk membuat layanan web yang mengintegrasikan Salesforce dengan aplikasi lain.
  • Untuk mengimplementasikan validasi khusus pada sObjects.
  • Untuk menjalankan logika Apex kustom saat operasi DML dilakukan.
  • Untuk mengimplementasikan fungsionalitas yang tidak dapat dibangun dengan alat otomatisasi deklaratif yang ada seperti Flow.
  • Untuk mengatur layanan email yang memproses isi, header, dan lampiran email yang masuk.

Setelah Anda mengetahui kapan Apex adalah pilihan yang tepat, langkah selanjutnya adalah memahami apa yang terjadi pada kode Anda setelah Anda menyimpannya.

Struktur Kerja Apex

Berikut adalah alur tindakan untuk kode Apex:

  • Tindakan Pengembang: Ketika pengembang menyimpan kode ke platform, semua kode Apex dikompilasi menjadi serangkaian instruksi yang dapat dipahami oleh interpreter runtime Apex, dan instruksi ini kemudian disimpan sebagai metadata di platform.
  • Tindakan Pengguna Akhir: Ketika suatu kejadian pengguna mengeksekusi kode Apex, server platform mengambil instruksi yang telah dikompilasi dari metadata dan menjalankannya melalui interpreter Apex sebelum mengembalikan hasilnya.

Diagram di bawah ini menunjukkan bagaimana tindakan pengembang dan pengguna akhir berinteraksi dengan server aplikasi Lightning Platform:

Struktur Kerja Apex

Lingkungan Pengembangan Puncak

Kode Apex dapat dikembangkan baik di lingkungan sandbox maupun di organisasi Salesforce Developer Edition.

Sebaiknya kode dikembangkan di lingkungan sandbox terlebih dahulu, kemudian di-deploy ke lingkungan produksi, seperti yang diilustrasikan di bawah ini:

Lingkungan Pengembangan Puncak

Alat pengembangan kode Apex: Berikut adalah tiga alat yang tersedia untuk mengembangkan kode Apex di semua edisi Salesforce:

  • Konsol Pengembang
  • Visual Studio Code dengan Salesforce Extension Pack (ini menggantikan Force.com IDE yang sudah tidak digunakan lagi)
  • Code editor di antarmuka pengguna Pengaturan Salesforce

Setelah lingkungan Anda siap, mari kita lihat elemen-elemen dasar dari bahasa itu sendiri, dimulai dengan tipe data.

Tipe Data di Apex

Berikut adalah tipe data yang didukung oleh Apex:

Primitif

Bilangan bulat DoubleLong, Date, Datetime, Decimal, Time, Blob, String, ID, dan Boolean dianggap sebagai tipe data primitif. Semua tipe data primitif dilewatkan berdasarkan nilai, bukan berdasarkan referensi.

koleksi

Terdapat tiga jenis koleksi yang tersedia di Apex:

  • Daftar: Ini adalah kumpulan tipe data primitif, sObject, koleksi, atau objek Apex yang diurutkan berdasarkan indeks.
  • Set: Koleksi tak berurut yang berisi elemen unik dan tidak mengandung duplikat.
  • Peta: Ini adalah kumpulan kunci unik yang dipetakan ke nilai tunggal, yang dapat berupa tipe data primitif, sObject, koleksi, atau objek Apex.

sObjek

Ini adalah tipe data khusus di Salesforce. Ini mirip dengan tabel di SQL dan berisi kolom-kolom yang mirip dengan kolom-kolom dalam SQL.

Enum

Enum adalah sebuah abstracTipe data t yang menyimpan satu nilai dari himpunan terbatas pengidentifikasi yang ditentukan.

Kelas, Objek, dan Antarmuka

Kelas dan antarmuka Apex yang didefinisikan pengguna juga dapat digunakan sebagai tipe data. Sebuah objek mengacu pada sebuah instance dari tipe data apa pun yang didukung di Apex.

Sintaks Puncak

Deklarasi Variabel

Karena Apex adalah bahasa yang sangat terstruktur dalam hal tipe data, maka wajib untuk mendeklarasikan variabel dengan tipe data yang sesuai di Apex.

Sebagai contoh:

Contact con = new Contact();

Di sini variabel con dideklarasikan dengan tipe data Contact.

Kueri SOQL

SOQL adalah singkatan dari Salesforce Object Query Language. SOQL digunakan untuk mengambil data sObject dari basis data Salesforce. Contohnya:

Account acc = [SELECT Id, Name FROM Account LIMIT 1];

Kueri di atas mengambil catatan akun dari basis data Salesforce.

Pernyataan Lingkaran

Pernyataan perulangan digunakan untuk mengulang (iterasi) melalui data dalam sebuah daftar. Jumlah iterasi sama dengan jumlah data dalam daftar. Misalnya:

List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
	//your logic
}

Pada cuplikan kode di atas, listOfAccounts adalah variabel dengan tipe data List.

Pernyataan Kontrol Aliran

Pernyataan kontrol alur bermanfaat ketika Anda ingin mengeksekusi beberapa baris kode berdasarkan kondisi tertentu.

Sebagai contoh:

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
}

Cuplikan kode di atas mengambil catatan akun dari basis data dan memeriksa ukuran daftar.

Pernyataan DML

DML adalah singkatan dari Data Manipulation Language. Pernyataan DML digunakan untuk memanipulasi data dalam basis data Salesforce. Contohnya:

Account acc = new Account(Name = 'Test Account');
insert acc; //DML statement to create account record.

Penentu Akses Apex

Berikut adalah penentu akses yang didukung oleh Apex:

Publik

Penentu akses ini memberikan akses ke kelas, metode, atau variabel yang akan digunakan oleh Apex di dalam sebuah namespace.

Swasta

Penentu akses ini memberikan akses ke kelas, metode, atau variabel untuk digunakan secara lokal, atau di dalam bagian kode tempat ia didefinisikan. Semua metode dan variabel yang tidak memiliki penentu akses yang ditentukan akan menggunakan penentu akses default yaitu private.

Terlindung

Penentu akses ini memberikan akses ke suatu metode atau variabel untuk digunakan oleh kelas dalam mana pun di dalam kelas Apex yang mendefinisikannya.

Aksi

Penentu akses ini memberikan akses ke kelas, metode, atau variabel yang akan digunakan oleh Apex di dalam namespace maupun di luar namespace. Sebaiknya hindari penggunaan kata kunci global kecuali jika memang diperlukan.

Kata kunci di Apex

Dengan berbagi

Jika sebuah kelas didefinisikan dengan kata kunci ini, maka semua aturan berbagi yang berlaku untuk pengguna saat ini akan diberlakukan. Jika kata kunci ini tidak ada, kode akan dieksekusi dalam konteks sistem.

Sebagai contoh:

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

Tanpa berbagi

Jika sebuah kelas didefinisikan dengan kata kunci ini, maka aturan berbagi yang berlaku untuk pengguna saat ini tidak diberlakukan.

Sebagai contoh:

public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}

Statis

Variabel atau metode yang didefinisikan dengan kata kunci static diinisialisasi sekali dan dikaitkan dengan kelas. Variabel dan metode statis dapat dipanggil langsung dengan nama kelas tanpa membuat instance kelas tersebut.

Terakhir

Konstanta atau metode yang didefinisikan dengan kata kunci final tidak dapat ditimpa. Misalnya:

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

Jika Anda mencoba menimpa nilai variabel INT_CONST ini, Anda akan mendapatkan pengecualian – System.FinalException: Variabel final telah diinisialisasi.

Pengembalian

Kata kunci ini mengembalikan nilai dari suatu metode. Misalnya:

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

Null

Ini mendefinisikan konstanta null dan dapat diberikan ke sebuah variabel. Misalnya:

Boolean b = null;

maya

Jika sebuah kelas didefinisikan dengan kata kunci virtual, maka kelas tersebut dapat diperluas dan ditimpa.

Abstract

Jika suatu kelas didefinisikan dengan abstracJika kata kunci t ada, maka harus terdapat setidaknya satu metode dengan kata kunci abs.tract, dan metode tersebut seharusnya hanya memiliki tanda tangan.

Sebagai contoh:

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

Tali Puncak

String adalah sekumpulan karakter tanpa batasan jumlah karakter. Misalnya:

String name = 'Test';

Terdapat beberapa metode bawaan yang disediakan oleh kelas String di Salesforce. Berikut adalah beberapa metode yang sering digunakan:

menyingkat (maxWidth)

Metode ini memotong string hingga panjang yang ditentukan dan mengembalikannya jika panjang string yang diberikan lebih panjang dari panjang yang ditentukan; jika tidak, ia mengembalikan string asli. Jika nilai variabel maxWidth kurang dari 4, metode ini akan melempar pengecualian runtime – System.StringException: Lebar singkatan minimum adalah 4.

Sebagai contoh:

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

kapitalisasi ()

Metode ini mengubah huruf pertama dari sebuah string menjadi huruf judul dan mengembalikannya.

Sebagai contoh:

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

berisi (substring)

Metode ini mengembalikan nilai true jika string yang memanggil metode tersebut berisi substring yang ditentukan.

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

sama dengan(stringOrId)

Metode ini mengembalikan nilai true jika parameter yang diberikan bukan null dan mewakili urutan karakter biner yang sama dengan string yang memanggil metode tersebut.

Saat membandingkan nilai ID, panjang ID mungkin tidak sama. Misalnya, jika string yang mewakili ID 15 karakter dibandingkan dengan objek yang mewakili ID 18 karakter, metode ini tetap mengembalikan nilai true. Contohnya:

String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true

Pada contoh di atas, metode equals membandingkan ID objek 15 karakter dengan ID objek 18 karakter, dan jika kedua ID tersebut mewakili urutan biner yang sama, maka metode tersebut mengembalikan nilai true.

Gunakan metode ini untuk membuat perbandingan peka huruf besar-kecil.

escapeSingleQuotes(stringToEscape)

Metode ini menambahkan karakter escape (\) sebelum tanda kutip tunggal dalam sebuah string dan mengembalikan hasilnya. Metode ini mencegah injeksi SOQL saat membuat kueri SOQL dinamis. Ini memastikan bahwa semua tanda kutip tunggal diperlakukan sebagai string yang mengapit, bukan sebagai perintah basis data.

Sebagai contoh:

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

hapus (substring)

Metode ini menghapus semua kemunculan substring yang disebutkan dari string yang memanggil metode tersebut dan mengembalikan string hasilnya.

Sebagai contoh:

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

substring(mulaiIndeks)

Metode ini mengembalikan substring yang dimulai dari karakter pada startIndex dan berlanjut hingga akhir string.

Sebagai contoh:

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

balik()

Metode ini membalik semua karakter dalam sebuah string dan mengembalikannya. Misalnya:

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

memangkas()

Metode ini menghapus semua spasi kosong di awal dan akhir string, lalu mengembalikannya.

nilaiDari(untuk Mengonversi)

Metode ini mengembalikan representasi string dari objek yang diberikan.

String, kelas, dan kata kunci akan menyatu ketika Anda mulai mengemas logika ke dalam unit yang dapat digunakan kembali, dan itulah tujuan dari kelas Apex.

Kelas Puncak

Kelas Apex adalah cetak biru atau templat yang digunakan untuk membuat objek. Objek adalah sebuah instance dari kelas tersebut.

Ada tiga cara untuk membuat kelas Apex di Salesforce:

  • Konsol Pengembang
  • Visual Studio Code dengan Salesforce Extension Pack
  • Halaman detail kelas Apex di Pengaturan

Di Apex, Anda dapat mendefinisikan kelas luar, yang juga disebut kelas tingkat atas, dan Anda juga dapat mendefinisikan kelas di dalam kelas luar, yang disebut kelas dalam.

Penggunaan pengubah akses seperti global atau public wajib dilakukan dalam deklarasi kelas luar.

Tidak perlu menggunakan pengubah akses dalam deklarasi kelas dalam.

Kelas Apex didefinisikan menggunakan kata kunci class diikuti dengan nama kelas.

Kata kunci `extends` digunakan untuk memperluas kelas yang sudah ada dalam kelas Apex, dan kata kunci `implements` digunakan untuk mengimplementasikan antarmuka dalam kelas Apex.

Salesforce Apex tidak mendukung pewarisan berganda; sebuah kelas Apex hanya dapat memperluas satu kelas Apex yang sudah ada tetapi dapat mengimplementasikan beberapa antarmuka.

Sebuah kelas Apex dapat berisi konstruktor yang ditentukan pengguna, dan jika konstruktor yang ditentukan pengguna tidak tersedia, maka konstruktor default akan digunakan. Kode dalam konstruktor akan dieksekusi ketika sebuah instance dari kelas tersebut dibuat.

Sintaks kelas Apex:

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

Kata kunci `new` digunakan untuk membuat instance dari kelas Apex. Berikut adalah sintaks untuk membuat instance dari kelas Apex:

myApexClass obj = new myApexClass();

Apex Pengambil dan Penyetel

Properti Apex mirip dengan variabel Apex. Sebuah getter dan sebuah setter diperlukan untuk properti Apex. Keduanya dapat digunakan untuk mengeksekusi kode sebelum nilai properti diakses atau diubah. Kode dalam accessor get dieksekusi ketika nilai properti dibaca. Kode dalam accessor set dieksekusi ketika nilai properti diubah. Properti apa pun yang hanya memiliki accessor get dianggap hanya baca (read-only), properti apa pun yang hanya memiliki accessor set dianggap hanya tulis (write-only), dan properti apa pun yang memiliki accessor get dan set dianggap baca-tulis (read-write). Sintaks properti Apex:

public class myApexClass {
// Property declaration
	access_modifier return_type property_name {
	get {
			//code
		}
		set{
			//code
		}
	}
}

Di sini, access_modifier adalah pengubah akses properti, return_type adalah tipe data properti, dan property_name adalah nama properti.

Berikut adalah contoh properti Apex yang memiliki aksesor get dan set:

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

Di sini, nama propertinya adalah name, ini adalah properti publik, dan mengembalikan tipe data String.

Tidak wajib untuk menyertakan kode di dalam blok `get` dan `set`. Blok-blok ini dapat dibiarkan kosong untuk mendefinisikan properti secara otomatis. Misalnya:

public double MyReadWriteProp{ get; set; }

Pengakses get dan set juga dapat didefinisikan dengan pengubah aksesnya sendiri. Jika sebuah pengakses didefinisikan dengan pengubah, maka itu akan menimpa pengubah akses properti tersebut. Misalnya:

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

Kelas mendefinisikan logika yang dapat digunakan kembali yang Anda panggil secara eksplisit. Pemicu, yang akan dibahas selanjutnya, berjalan secara otomatis setiap kali data berubah.

Pemicu Puncak

Trigger Apex memungkinkan Anda untuk mengeksekusi Apex kustom sebelum dan sesudah operasi DML dilakukan.

Apex mendukung dua jenis pemicu berikut:

Sebelum pemicu: Trigger ini digunakan untuk memvalidasi dan memperbarui nilai suatu field sebelum data disimpan ke dalam database.

Setelah pemicu: Trigger ini digunakan untuk mengakses nilai field (seperti ID record dan field LastModifiedDate) yang ditetapkan oleh sistem setelah record dimasukkan ke dalam database. Nilai field ini dapat digunakan untuk memodifikasi record lain. Record yang dipicu setelah trigger bersifat read-only.

Sebaiknya gunakan trigger yang mendukung pemrosesan massal (bulkified trigger). Trigger yang mendukung pemrosesan massal dapat memproses satu record maupun beberapa record sekaligus.

Sintaks pemicu Apex:

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

Di sini, TriggerName adalah nama pemicu, ObjectName adalah nama objek tempat pemicu tersebut ditulis, dan trigger_events adalah daftar peristiwa yang dipisahkan oleh koma.

Berikut adalah event yang didukung oleh trigger Apex: before insert, before update, before delete, after insert, after update, after delete, after undelete.

Kata kunci statis tidak dapat digunakan dalam trigger Apex. Semua kata kunci yang berlaku untuk kelas dalam (inner class) dapat digunakan dalam trigger Apex.

Terdapat variabel implisit yang didefinisikan oleh setiap trigger yang mengembalikan konteks runtime. Variabel-variabel ini didefinisikan dalam kelas System.Trigger dan disebut variabel konteks. Dua tangkapan layar di bawah ini mencantumkan variabel konteks yang didukung oleh trigger Apex:

Variabel Konteks Pemicu Apex

Variabel Konteks Pemicu Apex (Lanjutan)

Berikut adalah beberapa pertimbangan untuk variabel konteks dalam trigger Apex:

  • Jangan gunakan trigger.new dan trigger.old dalam operasi DML.
  • Trigger.new tidak dapat dihapus.
  • Trigger.new bersifat read-only setelah pemicu.
  • Trigger.new hanya dapat digunakan untuk mengubah nilai field pada objek yang sama dalam trigger before.

Dua tangkapan layar di bawah ini mencantumkan pertimbangan tentang tindakan spesifik dalam berbagai peristiwa pemicu:

Pertimbangan Peristiwa Pemicu Apex

Pertimbangan Peristiwa Pemicu Apex (Lanjutan)

Trigger menangani logika waktu nyata, tetapi beberapa pekerjaan terlalu besar untuk satu transaksi. Di situlah batch Apex berperan.

Kelas Batch di Apex

Kelas batch di Salesforce digunakan untuk memproses sejumlah besar data yang akan melebihi batas governor Apex jika diproses secara normal. Kelas batch mengeksekusi kode secara asinkron.

Berikut adalah keuntungan dari kelas kelompok (batch class):

  • Kelas batch memproses data dalam potongan-potongan, dan jika satu potongan gagal diproses dengan sukses, potongan-potongan yang berhasil diproses tidak akan dibatalkan.
  • Setiap bagian data dalam kelas batch diproses dengan serangkaian batasan governor baru, yang memastikan bahwa kode dieksekusi dalam batas eksekusi governor.

Antarmuka Database.Batchable harus diimplementasikan oleh kelas Apex agar dapat digunakan sebagai kelas batch. Antarmuka ini menyediakan tiga metode yang harus diimplementasikan oleh kelas batch:

1. mulai()

Metode ini menghasilkan cakupan catatan atau objek yang akan diproses oleh metode antarmuka execute. Metode ini hanya dipanggil sekali selama eksekusi batch. Metode ini mengembalikan objek Database.QueryLocator atau Iterable. Jumlah catatan yang dapat diambil oleh kueri SOQL menggunakan objek Database.QueryLocator adalah 50 juta, tetapi menggunakan Iterable, jumlah total catatan yang dapat diambil oleh kueri SOQL hanya 50,000. Iterable digunakan untuk menghasilkan cakupan yang kompleks untuk kelas batch.

Sintaks metode start:

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

2. jalankan()

Metode ini digunakan untuk memproses setiap bagian data. Metode execute dipanggil untuk setiap bagian data. Ukuran batch default untuk eksekusi adalah 200 data. Metode execute menerima dua argumen:

Referensi ke objek Database.BatchableContext,

Daftar sObject, seperti List. , atau daftar tipe berparameter. Sintaks metode execute:

global void execute(Database.BatchableContext bc, List<P> records){}

3. selesai()

Metode `finish` dipanggil sekali selama eksekusi kelas `batch`. Operasi pasca-pemrosesan dapat dilakukan di dalam metode `finish`. Misalnya: mengirim email konfirmasi. Metode ini dipanggil ketika semua batch telah diproses. Sintaks metode `finish`:

global void finish(Database.BatchableContext bc){}

Objek Database.BatchableContext

Setiap metode dari antarmuka Database.Batchable memiliki referensi ke objek Database.BatchableContext.

Objek ini digunakan untuk track kemajuan pekerjaan batch.

Berikut adalah metode instance yang disediakan oleh BatchableContext:

  • getChildJobId(): Metode ini mengembalikan ID dari pekerjaan batch yang sedang diproses.
  • getJobId(): Metode ini mengembalikan ID pekerjaan batch.

Berikut adalah sintaks kelas batch:

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
}
}

Metode Database.executeBatch

Metode Database.executeBatch digunakan untuk mengeksekusi kelas batch.

Metode ini menerima dua parameter: sebuah instance dari kelas batch yang akan diproses, dan parameter cakupan opsional untuk menentukan ukuran batch. Jika tidak ditentukan, ukuran default 200 akan digunakan.

Sintaks Database.executeBatch:

Database.executeBatch(myBatchObject, scope)

Menjalankan kelas batch bernama MyBatchClass:

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

Basis data.Stateful

Kelas batch secara default bersifat stateless. Setiap kali metode execute dipanggil, salinan objek yang baru diterima, dan semua variabel kelas diinisialisasi.

Database.Stateful diimplementasikan untuk membuat kelas batch memiliki status (stateful).

Jika kelas batch Anda mengimplementasikan Basis DataAntarmuka stateful, semua variabel instance mempertahankan nilainya, tetapi variabel statis direset di antara transaksi.

Apex Asinkron Melampaui Batch

Batch Apex hanyalah salah satu dari beberapa cara untuk menjalankan kode secara asinkron. Salesforce menyediakan empat opsi asinkron, dan memilih yang tepat bergantung pada seberapa banyak data yang Anda proses dan apakah pekerjaan perlu dirantai atau dijadwalkan.

  • Metode di masa depan: Dengan anotasi @future, ini paling cocok untuk operasi sederhana yang hanya dijalankan sekali, seperti panggilan ke layanan web eksternal.
  • Apex yang dapat diantrekan: Mengimplementasikan antarmuka Queueable, menerima tipe objek kompleks, mengembalikan ID pekerjaan, dan mendukung penggabungan satu pekerjaan dengan pekerjaan lainnya.
  • Batch Apex: Memproses volume data yang sangat besar secara bertahap, seperti yang dijelaskan di atas.
  • Apex Terjadwal: Mengimplementasikan antarmuka Schedulable sehingga sebuah kelas berjalan pada waktu tertentu, seperti pekerjaan pembersihan malam hari.
Tipe terbaik Untuk Kemampuan Utama
Metode masa depan Panggilan sederhana Nyalakan dan lupakan.
Apex yang Dapat Diantrekan Pemrosesan berurutan Penggabungan dan pemantauan pekerjaan
Puncak Batch Jutaan catatan Pemrosesan berkelompok
Apex Terjadwal Pekerjaan berulang Pengaturan waktu berbasis Cron

Model eksekusi apa pun yang Anda pilih, setiap transaksi tetap diukur berdasarkan batasan governor di seluruh platform yang tercantum di bawah ini.

Batas Gubernur Puncak

Batas governor Apex adalah batasan yang diberlakukan oleh mesin runtime Apex untuk memastikan bahwa kode dan proses Apex yang berjalan tanpa kendali tidak memonopoli sumber daya bersama dan tidak mengganggu pemrosesan pengguna lain di lingkungan multi-tenant. Batasan ini diverifikasi terhadap setiap transaksi Apex. Berikut adalah batas governor yang ditentukan oleh Salesforce pada setiap transaksi Apex:

Deskripsi batas
Kueri SOQL yang dapat dilakukan dalam transaksi sinkron 100
Kueri SOQL yang dapat dilakukan dalam transaksi asinkron. 200
Catatan yang dapat diambil dengan kueri SOQL 50,000
Catatan yang dapat diambil oleh Database.getQueryLocator 10,000
Kueri SOSL yang dapat dilakukan dalam transaksi Apex. 20
Catatan yang bisa diambil dengan kueri SOSL 2,000
Pernyataan DML yang dapat dilakukan dalam transaksi Apex. 150
Catatan yang dapat diproses sebagai hasil dari pernyataan DML, Approval.process, atau database.emptyRecycleBin 10,000
Panggilan fungsi yang dapat dilakukan dalam transaksi Apex 100
Batas waktu kumulatif pada semua panggilan keluar yang dilakukan dalam transaksi Apex. 120 detik
Batasan jumlah job Apex yang dapat ditambahkan ke antrian dengan System.enqueueJob 50
Batas waktu eksekusi untuk setiap transaksi Apex 10 menit
Batasan jumlah karakter yang dapat digunakan dalam kelas dan pemicu Apex. 1 juta
Batas waktu CPU untuk transaksi sinkron milidetik 10,000
Batas waktu CPU untuk transaksi asinkron milidetik 60,000
Ukuran tumpukan total 6 MB (sinkron) / 12 MB (asinkron)

Cara Menulis Kelas Pengujian di Apex

Salesforce mensyaratkan bahwa setidaknya 75 persen kode Apex Anda harus tercakup oleh pengujian unit sebelum Anda dapat menerapkannya ke lingkungan produksi, dan setiap pemicu (trigger) harus memiliki cakupan pengujian. Oleh karena itu, menulis kelas pengujian adalah keterampilan inti Apex, bukan tambahan opsional.

Kelas pengujian diberi anotasi @isTest, dan setiap metode pengujian juga ditandai dengan @isTest. Metode pengujian tidak melakukan commit data ke database dan tidak melihat sebagian besar data org yang ada, sehingga setiap pengujian membuat catatannya sendiri. Metode Test.startTest() dan Test.stopTest() memberikan kode yang sedang diuji serangkaian batasan governor yang baru, dan pernyataan (assertions) memverifikasi bahwa logika tersebut berperilaku seperti yang diharapkan.

Berikut adalah kelas pengujian sederhana untuk logika pembuatan akun:

@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);
    }
}

Ikuti pedoman ini saat membuat tes:

  • Gunakan metode @testSetup untuk membuat data uji bersama sekali untuk semua metode pengujian dalam kelas tersebut.
  • Uji perilaku massal dengan memasukkan 200 data, bukan hanya satu.
  • Mencakup skenario positif, negatif, dan pengguna terbatas.
  • Selalu sertakan pernyataan System.assert yang bermakna; cakupan tanpa pernyataan tidak membuktikan apa pun.

Praktik Terbaik Apex

Para pemula sering menulis kode Apex yang berfungsi untuk satu data tetapi gagal dalam operasi massal di dunia nyata. Praktik-praktik di bawah ini menjaga kode Anda tetap berada dalam batas governor dan lebih mudah dipelihara:

  • Gabungkan semuanya menjadi satu paket: Tulis logika yang menangani kumpulan data, karena pemicu (trigger) dapat menerima hingga 200 data dalam satu batch.
  • Hindari penggunaan SOQL dan DML dalam perulangan: Lakukan query sebelum perulangan, kumpulkan perubahan dalam sebuah daftar, dan jalankan satu pernyataan DML setelah perulangan.
  • Satu pemicu per objek: Jaga agar pemicu (trigger) bebas dari logika dan delegasikan pekerjaan ke kelas penangan (handler classes), yang membuat urutan eksekusi dapat diprediksi.
  • Gunakan untuk berbagi: Terapkan pengamanan tingkat catatan kecuali ada alasan yang terdokumentasi untuk menjalankannya dalam konteks sistem.
  • Hindari memasukkan ID secara langsung ke dalam kode: ID rekaman berbeda antara lingkungan sandbox dan produksi, jadi lakukan query untuk mendapatkannya atau gunakan Metadata Kustom sebagai gantinya.
  • Pantau batasan dalam kode: Metode-metode dalam kelas Limits, seperti Limits.getQueries(), memungkinkan Anda untuk memeriksa konsumsi sumber daya pada saat runtime.

💡 olymp trade indonesiaTip: Jalankan kode Anda terhadap 200 data di lingkungan uji (sandbox) sebelum melakukan deployment. Sebagian besar kegagalan batas governor hanya muncul pada volume data yang besar, dan mendeteksinya sejak dini jauh lebih murah daripada melakukan debugging di lingkungan produksi.

Pertanyaan Umum Demo Slot

Tidak. Apex meminjam JavaSintaksnya mirip, tetapi tidak peka terhadap huruf besar/kecil, hanya berjalan di Salesforce Lightning Platform, mengintegrasikan SOQL langsung ke dalam bahasa, dan diatur oleh batasan per transaksi yang Java tidak memiliki.

Daftar untuk mendapatkan organisasi Salesforce Developer Edition gratis, yang mencakup Konsol Pengembang, dan ikuti latihan praktik langsung tentang Jejak, platform pembelajaran resmi dari Salesforce.

Visualforce adalah bahasa markup untuk membangun halaman antarmuka pengguna, sedangkan Apex adalah bahasa sisi server yang menyediakan logika di baliknya. Halaman Visualforce sering memanggil kelas pengontrol Apex untuk melakukan kueri dan memperbarui data.

Ya. Agentforce untuk Pengembang, asisten AI dari Salesforce untuk Visual Studio CodeAI menghasilkan dan menjelaskan kode Apex dari perintah bahasa alami. Selalu tinjau dan uji kode yang dihasilkan AI terhadap batasan governor sebelum digunakan.

Kelas Apex yang ditandai dengan anotasi @InvocableMethod dapat diekspos sebagai tindakan kustom, memungkinkan bot Einstein dan agen Agentforce untuk memanggil logika bisnis Anda, sementara Apex juga dapat memanggil templat prompt Einstein dan model AI melalui API platform.

Ringkaslah postingan ini dengan: