Salesforce Apex Başlangıç Rehberi
⚡ Akıllı Özet
Apex programlama, Salesforce geliştiricilerine CRM'ye özel iş mantığı eklemek için nesne yönelimli, güçlü tipli bir dil sunar. Sınıfları, tetikleyicileri ve toplu işleri desteklerken, yönetici sınırları paylaşılan çok kullanıcılı platformun istikrarlı kalmasını sağlar.

Salesforce'ta Apex nedir?
Tepe Apex, Salesforce tarafından Yazılım Hizmeti (SaaS) ve Müşteri İlişkileri Yönetimi (CRM) uygulamaları oluşturmak için geliştirilmiş, nesne yönelimli ve güçlü tipli bir programlama dilidir. Apex, geliştiricilerin üçüncü taraf SaaS uygulamaları oluşturmasına ve arka uç veritabanı desteği ve istemci-sunucu arayüzleri sağlayarak sistem olaylarına iş mantığı eklemesine yardımcı olur.
Apex, geliştiricilerin düğme tıklamaları, ilgili kayıt güncellemeleri ve Visualforce sayfaları gibi sistem olaylarına iş mantığı eklemelerine yardımcı olur. Apex'in sözdizimi şuna benzer: Java. Salesforce'a kaydolun CRM'nin nasıl çalıştığını öğrenmek için.
Apex Programlama Dilinin Özellikleri
Salesforce Apex'in önemli özellikleri şunlardır:
- Apex büyük/küçük harf duyarlılığı olmayan bir dildir.
- Apex kullanarak sObject kayıtları üzerinde INSERT, UPDATE, UPSERT ve DELETE gibi DML işlemlerini gerçekleştirebilirsiniz.
- Apex'te SOQL (Salesforce Nesne Sorgulama Dili) ve SOSL (Salesforce Nesne Arama Dili) kullanarak sObject kayıtlarını sorgulayabilirsiniz.
- oluşturmanıza olanak sağlar. ünite testi ve doğrulamak için çalıştırın. kod kapsamı ve Apex'teki kodun verimliliği.
- Apex çok kiracılı bir ortamda yürütülür ve Satış Gücü Salesforce, kullanıcıların paylaşılan kaynakları tekeline almasını engelleyen yönetici sınırları tanımlamıştır. Salesforce yönetici sınırını aşan herhangi bir kod başarısız olur ve bir hata mesajı görüntülenir.
- Salesforce nesneleri Apex'te veri türü olarak kullanılabilir. Örneğin:
Account acc = new Account();
Burada, Account standart bir Salesforce nesnesidir.
- Apex, her Salesforce sürümünde otomatik olarak yükseltilir.
Bir geliştirici Apex'i ne zaman tercih etmelidir?
Apex kodu yalnızca bir iş senaryosu, Salesforce tarafından sağlanan önceden oluşturulmuş, tıklama ve sürükleme yöntemiyle uygulanamayacak kadar karmaşık olduğunda yazılmalıdır.
Aşağıda Apex kodu yazmanız gereken birkaç senaryo bulunmaktadır:
- Salesforce'u diğer uygulamalarla entegre eden web hizmetleri oluşturmak.
- sObject'ler üzerinde özel doğrulama uygulamak için.
- DML işlemi gerçekleştirildiğinde özel Apex mantığını çalıştırmak için.
- Flow gibi mevcut bildirimsel otomasyon araçlarıyla oluşturulamayan işlevleri uygulamak için.
- Kurmak e-posta hizmetleri Gelen e-postaların içeriğini, başlıklarını ve eklerini işleyen.
Apex'in doğru seçim olduğunu anladıktan sonraki adım, kodunuzu kaydettikten sonra ne olduğunu anlamaktır.
Apex'in Çalışma Yapısı
Apex kodu için işlem akışı aşağıdaki gibidir:
- Geliştirici Eylemi: Geliştirici kodu platforma kaydettiğinde, tüm Apex kodu Apex çalışma zamanı yorumlayıcısının anlayabileceği bir dizi talimata derlenir ve bu talimatlar daha sonra platformda meta veri olarak kaydedilir.
- Son Kullanıcı Eylemi: Kullanıcı olayı Apex kodunu çalıştırdığında, platform sunucusu derlenmiş talimatları meta verilerden alır ve sonucu döndürmeden önce Apex yorumlayıcısından geçirir.
Aşağıdaki diyagram, geliştirici ve son kullanıcı eylemlerinin Lightning Platform uygulama sunucusuyla nasıl etkileşim kurduğunu göstermektedir:
Apex Geliştirme Ortamı
Apex kodu, Salesforce'un bir sanal ortamında (sandbox) veya geliştirici sürümü (Developer Edition) organizasyonunda geliştirilebilir.
En iyi uygulama, kodu bir test ortamında geliştirmek ve ardından aşağıdaki örnekte gösterildiği gibi üretim ortamına dağıtmaktır:
Apex kod geliştirme araçları: Salesforce'un tüm sürümlerinde Apex kodu geliştirmek için kullanılabilecek üç araç şunlardır:
- Geliştirici Konsolu
- Visual Studio Code Salesforce Uzantı Paketi ile (bu, kullanımdan kaldırılan Force.com IDE'nin yerini almıştır)
- Code Salesforce Kurulum kullanıcı arayüzündeki düzenleyici
Ortamınız hazır olduğuna göre, veri türlerinden başlayarak dilin temel yapı taşlarına bir göz atalım.
Apex'te Veri Tipleri
Apex'in desteklediği veri türleri şunlardır:
Ilkel
Tamsayı, DoubleLong, Date, Datetime, Decimal, Time, Blob, String, ID ve Boolean, temel veri tipleri olarak kabul edilir. Tüm temel veri tipleri referans yoluyla değil, değer yoluyla geçirilir.
Koleksiyonlar
Apex'te üç tür koleksiyon mevcuttur:
- Liste: Bu, indekslere dayalı olarak düzenlenmiş temel veri türleri, sObject'ler, koleksiyonlar veya Apex nesnelerinin bir koleksiyonudur.
- Set: Yinelenen öğeler içermeyen, sıralanmamış, benzersiz öğelerden oluşan bir koleksiyon.
- Harita: Bu, tek değerlere karşılık gelen benzersiz anahtarların bir koleksiyonudur; bu değerler temel veri tipleri, sObject'ler, koleksiyonlar veya Apex nesneleri olabilir.
nesne
Bu, Salesforce'taki özel bir veri türüdür. Bir tabloya benzer SQL ve SQL'deki sütunlara benzer alanlar içerir.
Sıralamalar
Enum bir abs'dir.tracBelirtilen tanımlayıcıların sonlu bir kümesinden bir değeri saklayan t veri türü.
Sınıflar, Nesneler ve Arayüzler
Kullanıcı tanımlı Apex sınıfları ve arayüzleri de veri türü olarak kullanılabilir. Bir nesne, Apex'te desteklenen herhangi bir veri türünün bir örneğini ifade eder.
Apex Sözdizimi
Değişken Beyanı
Apex güçlü tipli bir dil olduğundan, Apex'te bir değişkeni veri tipiyle tanımlamak zorunludur.
Örneğin:
Contact con = new Contact();
Burada con değişkeni Contact veri türüyle tanımlanmıştır.
SOQL Sorgusu
SOQL, Salesforce Nesne Sorgulama Dili anlamına gelir. SOQL, Salesforce veritabanından sObject kayıtlarını almak için kullanılır. Örneğin:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Yukarıdaki sorgu, Salesforce veritabanından bir hesap kaydını getirir.
Döngü İfadesi
Bir listedeki kayıtlar üzerinde yineleme yapmak için döngü ifadesi kullanılır. Yineleme sayısı, listedeki kayıt sayısına eşittir. Örneğin:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
//your logic
}
Yukarıdaki kod parçacığında, listOfAccounts değişkeni List veri türündedir.
Akış Kontrol Beyanı
Bir akış kontrol ifadesi, belirli koşullara bağlı olarak bazı kod satırlarını çalıştırmak istediğinizde faydalıdır.
Örneğin:
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
}
Yukarıdaki kod parçası, veritabanından hesap kayıtlarını sorgular ve listenin boyutunu kontrol eder.
DML Bildirimi
DML, Veri İşleme Dili anlamına gelir. DML ifadeleri, Salesforce veritabanındaki verileri işlemek için kullanılır. Örneğin:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Apex Erişim Belirticileri
Aşağıda Apex tarafından desteklenen erişim belirleyicileri listelenmiştir:
Açık Alan
Bu erişim belirleyici, Apex'in bir ad alanı içinde kullanabileceği bir sınıfa, metoda veya değişkene erişim sağlar.
Özel Etkinlik
Bu erişim belirleyici, bir sınıfa, metoda veya değişkene yerel olarak veya tanımlandığı kod bölümü içinde erişim sağlar. Erişim belirleyicisi tanımlanmamış tüm metotlar ve değişkenler, varsayılan `private` erişim belirleyicisini alır.
korumalı
Bu erişim belirleyici, tanımlayan Apex sınıfı içindeki herhangi bir iç sınıf tarafından kullanılacak bir yönteme veya değişkene erişim sağlar.
Küresel
Bu erişim belirleyici, Apex'in bir ad alanı içinde ve dışında kullanabileceği bir sınıfa, metoda veya değişkene erişim sağlar. Gerekmedikçe global anahtar kelimesini kullanmamak en iyi uygulamadır.
Apex'teki Anahtar Kelimeler
Paylaşarak
Bir sınıf bu anahtar kelimeyle tanımlanırsa, mevcut kullanıcı için geçerli olan tüm paylaşım kuralları uygulanır. Bu anahtar kelime yoksa, kod sistem bağlamında çalışır.
Örneğin:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Paylaşmadan
Bir sınıf bu anahtar kelimeyle tanımlanırsa, mevcut kullanıcı için geçerli olan paylaşım kuralları uygulanmaz.
Örneğin:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
Statik
`static` anahtar kelimesiyle tanımlanan bir değişken veya metot, bir kez başlatılır ve sınıfla ilişkilendirilir. Statik değişkenler ve metotlar, sınıfın bir örneğini oluşturmaya gerek kalmadan doğrudan sınıf adıyla çağrılabilir.
Son
`final` anahtar kelimesiyle tanımlanan bir sabit veya metot geçersiz kılınamaz. Örneğin:
public class myCls {
static final Integer INT_CONST = 10;
}
Bu INT_CONST değişkeninin değerini geçersiz kılmaya çalışırsanız, System.FinalException: Final değişkeni zaten başlatılmış hatası alırsınız.
Dönüş
Bu anahtar kelime bir yöntemden bir değer döndürür. Örneğin:
public String getName() {
return 'Test';
}
Null
Bu, boş bir sabit tanımlar ve bir değişkene atanabilir. Örneğin:
Boolean b = null;
Sanal
Bir sınıf `virtual` anahtar kelimesiyle tanımlanırsa, genişletilebilir ve geçersiz kılınabilir.
Özet
Bir sınıf, mutlak değerle tanımlanmışsatract anahtar kelimesi, en az bir tane abs anahtar kelimesini içeren metot içermelidir.tract, ve bu yöntemin yalnızca bir imzası olmalıdır.
Örneğin:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex Dizisi
Dize, karakter sınırlaması olmayan bir karakter kümesidir. Örneğin:
String name = 'Test';
Salesforce'taki String sınıfı tarafından sağlanan çeşitli yerleşik yöntemler vardır. Aşağıda sık kullanılan yöntemlerden bazıları yer almaktadır:
kısalt(maxWidth)
Bu yöntem, bir dizeyi belirtilen uzunluğa kadar kısaltır ve verilen dizenin uzunluğu belirtilen uzunluktan uzunsa kısaltılmış dizeyi, aksi takdirde orijinal dizeyi döndürür. maxWidth değişkeninin değeri 4'ten küçükse, bu yöntem çalışma zamanı hatası fırlatır – System.StringException: Minimum kısaltma genişliği 4'tür.
Örneğin:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
büyük harfle yazmak ()
Bu yöntem, bir dizenin ilk harfini başlık harfine dönüştürür ve onu döndürür.
Örneğin:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
içerir(alt dize)
Bu yöntem, yöntemi çağıran dizenin belirtilen alt dizeyi içerip içermediğini kontrol ederek true değerini döndürür.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
eşittir(stringOrId)
Bu yöntem, geçirilen parametre boş değilse ve yöntemi çağıran dizenin ikili karakter dizisiyle aynıysa true değerini döndürür.
Kimlik değerlerini karşılaştırırken, kimliklerin uzunlukları eşit olmayabilir. Örneğin, 15 karakterlik bir kimliği temsil eden bir dize, 18 karakterlik bir kimliği temsil eden bir nesneyle karşılaştırılırsa, bu yöntem yine de doğru sonuç döndürür. Örneğin:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
Yukarıdaki örnekte, equals metodu 15 karakterlik bir nesne kimliğini 18 karakterlik bir nesne kimliğiyle karşılaştırır ve her iki kimlik de aynı ikili diziyi temsil ediyorsa true değerini döndürür.
Büyük/küçük harfe duyarlı karşılaştırmalar yapmak için bu yöntemi kullanın.
kaçışSingleQuotes(stringToEscape)
Bu yöntem, bir dizedeki tek tırnak işaretlerinin önüne bir kaçış karakteri (\) ekler ve sonucu döndürür. Bu yöntem, dinamik bir SOQL sorgusu oluşturulurken SOQL enjeksiyonunu önler. Tüm tek tırnak işaretlerinin veritabanı komutları yerine çevreleyen dizeler olarak ele alınmasını sağlar.
Örneğin:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
kaldır(alt dize)
Bu yöntem, yöntemi çağıran dizeden belirtilen alt dizenin tüm tekrarlarını kaldırır ve sonuç dizesini döndürür.
Örneğin:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
alt dize(startIndex)
Bu yöntem, startIndex karakterinden başlayıp dizenin sonuna kadar uzanan bir alt dize döndürür.
Örneğin:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
tersine çevirmek()
Bu yöntem, bir dizenin tüm karakterlerini tersine çevirir ve dizeyi döndürür. Örneğin:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
trim ()
Bu yöntem, bir metin dizisinin başındaki ve sonundaki tüm boşlukları kaldırır ve metin dizisini döndürür.
valueOf(toConvert)
Bu yöntem, kendisine iletilen nesnenin dize temsilini döndürür.
Mantığı yeniden kullanılabilir birimler halinde paketlemeye başladığınızda, dizeler, sınıflar ve anahtar kelimeler bir araya gelir; Apex sınıflarının amacı da tam olarak budur.
Apeks Sınıfı
Apex sınıfı, nesnelerin oluşturulduğu bir şablon veya kalıptır. Nesne ise bir sınıfın örneğidir.
Salesforce'ta Apex sınıfları oluşturmanın üç yolu vardır:
- Geliştirici Konsolu
- Visual Studio Code Salesforce Uzantı Paketi ile
- Setup'taki Apex sınıfı detay sayfası
Apex'te, üst düzey sınıf olarak da adlandırılan dış sınıflar tanımlayabileceğiniz gibi, iç sınıflar olarak adlandırılan dış sınıflar içinde de sınıflar tanımlayabilirsiniz.
Dış sınıfların tanımlanmasında global veya public gibi bir erişim belirleyici kullanmak zorunludur.
İç içe sınıfların tanımlanmasında erişim belirleyici kullanmak zorunlu değildir.
Apex sınıfı, `class` anahtar kelimesi ve ardından sınıf adı kullanılarak tanımlanır.
`extends` anahtar kelimesi, Apex sınıfında mevcut bir sınıfı genişletmek için kullanılır ve `implements` anahtar kelimesi, Apex sınıfında bir arayüzü uygulamak için kullanılır.
Salesforce Apex çoklu kalıtımı desteklemez; bir Apex sınıfı yalnızca mevcut bir Apex sınıfından miras alabilir, ancak birden fazla arayüzü uygulayabilir.
Apex sınıfları kullanıcı tanımlı bir kurucu metot içerebilir ve kullanıcı tanımlı bir kurucu metot mevcut değilse varsayılan bir kurucu metot kullanılır. Kurucu metottaki kod, sınıfın bir örneği oluşturulduğunda yürütülür.
Apex sınıfının sözdizimi:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
`new` anahtar kelimesi, bir Apex sınıfının örneğini oluşturmak için kullanılır. Aşağıda, bir Apex sınıfının örneğini oluşturmak için kullanılan sözdizimi verilmiştir:
myApexClass obj = new myApexClass();
Apex Getter ve Setter
Apex özelliği, Apex değişkenine benzer. Apex özelliği için bir getter ve bir setter gereklidir. Bunlar, özellik değerine erişilmeden veya değiştirilmeden önce kod çalıştırmak için kullanılabilir. Get erişimcisindeki kod, özellik değeri okunduğunda çalışır. Set erişimcisindeki kod, özellik değeri değiştirildiğinde çalışır. Yalnızca get erişimcisine sahip herhangi bir özellik salt okunur, yalnızca set erişimcisine sahip herhangi bir özellik salt yazılabilir ve hem get hem de set erişimcisine sahip herhangi bir özellik okuma-yazma olarak kabul edilir. Apex özelliğinin sözdizimi:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Burada, access_modifier özelliğin erişim değiştiricisidir, return_type özelliğin veri türüdür ve property_name özelliğin adıdır.
Aşağıda hem get hem de set erişim yöntemlerine sahip bir Apex özelliğinin örneği verilmiştir:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Burada özellik adı "name"dir, herkese açık bir özelliktir ve String veri türünde bir değer döndürür.
`get` ve `set` bloklarında kod bulunması zorunlu değildir. Bu bloklar, otomatik bir özellik tanımlamak için boş bırakılabilir. Örneğin:
public double MyReadWriteProp{ get; set; }
Get ve set erişimcileri, kendi erişim değiştiricileriyle de tanımlanabilir. Bir erişimci bir değiştiriciyle tanımlanırsa, özelliğin erişim değiştiricisini geçersiz kılar. Örneğin:
public String name{private get; set;}// name is private for read and public for write.
Sınıflar, açıkça çağırdığınız yeniden kullanılabilir mantığı tanımlar. Bir sonraki bölümde ele alınacak olan tetikleyiciler, kayıtlar değiştiğinde otomatik olarak çalışır.
Apeks Tetikleyici
Apex tetikleyicileri, bir DML işlemi gerçekleştirilmeden önce ve sonra özel Apex kodları çalıştırmanıza olanak tanır.
Apex aşağıdaki iki tetikleyici türünü destekler:
Tetikleyicilerden önce: Bu tetikleyiciler, kayıt veritabanına kaydedilmeden önce bir alanın değerini doğrulamak ve güncellemek için kullanılır.
Tetikleyicilerden sonra: Bu tetikleyiciler, bir kayıt veritabanına işlendikten sonra sistem tarafından ayarlanan alan değerlerine (örneğin kayıt kimliği ve SonDeğiştirme Tarihi alanı) erişmek için kullanılır. Bu alan değerleri, diğer kayıtları değiştirmek için kullanılabilir. Tetikleyicilerden sonra tetiklenen kayıtlar salt okunurdur.
Toplu işlem yapabilen tetikleyiciler yazmak en iyi uygulamadır. Toplu işlem yapabilen bir tetikleyici, tek bir kaydı veya aynı anda birden fazla kaydı işleyebilir.
Apex tetikleyicisinin sözdizimi:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Burada, TriggerName tetikleyicinin adıdır, ObjectName tetikleyicinin yazıldığı nesnenin adıdır ve trigger_events virgülle ayrılmış olaylar listesidir.
Apex tetikleyicilerinin desteklediği olaylar şunlardır: eklemeden önce, güncellemeden önce, silmeden önce, eklemeden sonra, güncellemeden sonra, silmeden sonra, silmeyi geri almadan sonra.
Apex tetikleyicilerinde statik anahtar kelimeler kullanılamaz. İç sınıflar için geçerli olan tüm anahtar kelimeler Apex tetikleyicilerinde kullanılabilir.
Her tetikleyici tarafından tanımlanan ve çalışma zamanı bağlamını döndüren örtük değişkenler vardır. Bu değişkenler System.Trigger sınıfında tanımlanır ve bağlam değişkenleri olarak adlandırılır. Aşağıdaki iki ekran görüntüsü, Apex tetikleyicileri tarafından desteklenen bağlam değişkenlerini listelemektedir:
Apex tetikleyicilerinde bağlam değişkenleri için dikkate alınması gereken hususlar şunlardır:
- DML işlemlerinde trigger.new ve trigger.old kullanmayın.
- Trigger.new silinemez.
- Trigger.new, after tetikleyicilerinde salt okunurdur.
- Trigger.new yalnızca before tetikleyicilerinde aynı nesne üzerindeki alanların değerlerini değiştirmek için kullanılabilir.
Aşağıdaki iki ekran görüntüsü, farklı tetikleyici olaylardaki belirli eylemlerle ilgili hususları listelemektedir:
Tetikleyiciler gerçek zamanlı mantığı yönetir, ancak bazı işler tek bir işlem için çok büyüktür. İşte bu noktada toplu Apex devreye giriyor.
Apex'te Toplu Sınıf
Salesforce'ta toplu işlem sınıfı, normalde işlendiğinde Apex yönetici sınırlarını aşacak çok sayıda kaydı işlemek için kullanılır. Toplu işlem sınıfı, kodu eşzamansız olarak yürütür.
Toplu derslerin avantajları şunlardır:
- Toplu işlem sınıfı verileri parçalar halinde işler ve bir parça başarıyla işlenemezse, başarıyla işlenen parçalar geri alınmaz.
- Toplu işlem sınıfındaki her veri parçası, yeni bir dizi sınırlayıcı limitiyle işlenir; bu da kodun sınırlayıcı limitler dahilinde çalışmasını sağlar.
Bir Apex sınıfının toplu işlem sınıfı olarak kullanılabilmesi için Database.Batchable arayüzünün uygulanması gerekir. Bu arayüz, toplu işlem sınıfı tarafından uygulanması gereken üç yöntem sağlar:
1. başlat()
Bu yöntem, `execute` arayüz yöntemi tarafından işlenecek kayıtların veya nesnelerin kapsamını oluşturur. Toplu işlem yürütülürken yalnızca bir kez çağrılır. Bu yöntem, bir `Database.QueryLocator` nesnesi veya bir `Iterable` döndürür. `Database.QueryLocator` nesnesi kullanılarak bir SOQL sorgusuyla alınabilecek kayıt sayısı 50 milyondur, ancak bir `Iterable` kullanıldığında SOQL sorgusuyla alınabilecek toplam kayıt sayısı yalnızca 50,000'dir. Bir `Iterable`, toplu işlem sınıfı için karmaşık bir kapsam oluşturmak için kullanılır.
Başlangıç yönteminin sözdizimi:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. yürüt()
Bu yöntem, verilerin her bir öbeğini işlemek için kullanılır. Her kayıt öbeği için execute yöntemi çağrılır. Varsayılan yürütme toplu iş boyutu 200 kayıttır. execute yöntemi iki argüman alır:
Database.BatchableContext nesnesine bir başvuru,
List gibi sObject'lerin bir listesi. veya parametreli türlerin bir listesi. execute yönteminin sözdizimi:
global void execute(Database.BatchableContext bc, List<P> records){}
3. bitir()
`finite` metodu, toplu işlem sınıfının yürütülmesi sırasında bir kez çağrılır. `finite` metodunda işlem sonrası işlemler gerçekleştirilebilir. Örneğin: onay e-postası gönderme. Bu metot, tüm toplu işlemler tamamlandığında çağrılır. `finite` metodunun sözdizimi şu şekildedir:
global void finish(Database.BatchableContext bc){}
Veritabanı.TopluİşlemBağlamı Nesnesi
Database.Batchable arayüzünün her bir metodu, Database.BatchableContext nesnesine bir referans içerir.
Bu nesne şu amaçla kullanılır: track, toplu işin ilerlemesini gösterir.
BatchableContext tarafından sağlanan örnek yöntemler şunlardır:
- getChildJobId(): Bu yöntem, şu anda işlenmekte olan toplu işin kimliğini döndürür.
- getJobId(): Bu yöntem toplu işin kimliğini döndürür.
Aşağıda bir toplu işlem sınıfının sözdizimi verilmiştir:
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 Yöntem
Database.executeBatch metodu, bir toplu işlem sınıfını çalıştırmak için kullanılır.
Bu yöntem iki parametre alır: işlenecek toplu işlem sınıfının bir örneği ve toplu işlem boyutunu belirtmek için isteğe bağlı bir kapsam parametresi. Belirtilmezse, varsayılan 200 boyutu kullanılır.
Database.executeBatch'in sözdizimi:
Database.executeBatch(myBatchObject, scope)
MyBatchClass adlı bir toplu işlem sınıfı yürütülüyor:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Veritabanı.Durumlu
Bir toplu işlem sınıfı varsayılan olarak durumsuz (stateless) yapıdadır. execute metodu her çağrıldığında, nesnenin yeni bir kopyası alınır ve sınıfın tüm değişkenleri başlatılır.
Database.Stateful, bir batch sınıfını durum bilgisi içerecek şekilde yapılandırmak için uygulanmıştır.
Toplu işlem sınıfınız aşağıdaki uygulamayı gerçekleştiriyorsa veritabanıDurum bilgisi içeren arayüzde, tüm örnek değişkenler değerlerini korurken, statik değişkenler işlemler arasında sıfırlanır.
Asenkron Apex, Toplu İşlemlerin Ötesinde
Batch Apex, kodu eşzamansız olarak çalıştırmanın birçok yolundan sadece biridir. Salesforce dört eşzamansız seçenek sunar ve doğru olanı seçmek, işlediğiniz veri miktarına ve işlerin zincirleme mi yoksa planlı mı çalıştırılması gerektiğine bağlıdır.
- Gelecekteki yöntemler: @future ile işaretlenmiş bu yöntemler, harici web servislerine yapılan çağrılar gibi basit, çalıştırıp unutma işlemleri için en uygundur.
- Sıraya alınabilir Apex: Queueable arayüzünü uygular, karmaşık nesne türlerini kabul eder, bir iş kimliği döndürür ve bir işi diğerine zincirleme olarak bağlamayı destekler.
- Toplu Apex: Yukarıda açıklandığı gibi, çok büyük veri hacimlerini parçalar halinde işler.
- Planlanmış Apex: Bir sınıfın belirli bir zamanda çalışmasını sağlamak için Schedulable arayüzünü uygular; örneğin, gece yapılan bir temizlik işi gibi.
| Menşei | En | Anahtar Yetenek |
|---|---|---|
| Gelecek yöntem | Basit açıklamalar | Ateşle ve unut |
| Sıraya Alınabilir Apex | Sıralı işleme | İş zincirleme ve izleme |
| Toplu Apex | Milyonlarca kayıt | Parçalı işleme |
| Planlanmış Apex | Tekrarlayan işler | Cron tabanlı zamanlama |
Hangi işlem modelini seçerseniz seçin, her işlem yine de aşağıda listelenen platform genelindeki limitlere göre ölçülür.
Apex Valisi Sınırları
Apex yönetici sınırları, Apex çalışma zamanı motoru tarafından, kontrolsüz Apex kodlarının ve süreçlerinin paylaşılan kaynakları tekeline almasını ve çok kullanıcılı ortamda diğer kullanıcıların işlemlerini aksatmasını önlemek için uygulanan sınırlardır. Bu sınırlar her Apex işlemi için doğrulanır. Aşağıda, Salesforce tarafından her Apex işlemi için tanımlanan yönetici sınırları verilmiştir:
| Açıklama | Sınırlamak |
|---|---|
| Eşzamanlı bir işlemde yapılabilen SOQL sorguları | 100 |
| Asenkron işlemde gerçekleştirilebilen SOQL sorguları | 200 |
| SOQL sorgusu tarafından alınabilecek kayıtlar | 50,000 |
| Database.getQueryLocator tarafından alınabilecek kayıtlar | 10,000 |
| Apex işlemi içinde yapılabilen SOSL sorguları | 20 |
| SOSL sorgusu ile alınabilecek kayıtlar | 2,000 |
| Apex işleminde yapılabilecek DML ifadeleri | 150 |
| DML ifadesi, Approval.process veya Database.emptyRecycleBin sonucunda işlenebilen kayıtlar | 10,000 |
| Apex işleminde yapılabilecek çağrılar | 100 |
| Apex işleminde gerçekleştirilen tüm çağrıların toplam zaman aşımı sınırı. | 120 saniye |
| System.enqueueJob ile kuyruğa eklenebilecek Apex işlerinin sayısı sınırlandırılmıştır. | 50 |
| Her Apex işlemi için yürütme süresi sınırı | 10 dakikadır. |
| Apex sınıfında ve tetikleyicisinde kullanılabilecek karakter sayısına sınırlama | 1 milyon |
| Senkron bir işlem için CPU zaman sınırı | Milisaniye 10,000 |
| Asenkron bir işlem için CPU zaman sınırı | Milisaniye 60,000 |
| Toplam yığın boyutu | 6 MB (senkron) / 12 MB (asenkron) |
Apex'te Test Sınıfı Nasıl Yazılır?
Salesforce, Apex kodunuzun en az %75'inin birim testleriyle kapsanmasını ve her tetikleyicinin bir şekilde test kapsamına alınmasını şart koşar. Bu nedenle test sınıfları yazmak, isteğe bağlı bir özellik değil, temel bir Apex becerisidir.
Bir test sınıfı `@isTest` ek açıklamasıyla işaretlenir ve her test metodu da `@isTest` ile işaretlenir. Test metotları veritabanına veri kaydetmez ve mevcut kuruluş verilerinin çoğunu görmez, bu nedenle her test kendi kayıtlarını oluşturur. `Test.startTest()` ve `Test.stopTest()` metotları, test edilen koda yeni bir dizi sınır değeri verir ve doğrulama işlemleri, mantığın beklendiği gibi davrandığını doğrular.
İşte hesap oluşturma mantığı için basit bir test sınıfı:
@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);
}
}
Test yazarken şu yönergeleri izleyin:
- Sınıftaki tüm test metotları için paylaşılan test verilerini bir kez oluşturmak için `@testSetup` yöntemini kullanın.
- Toplu işlem davranışını test etmek için yalnızca bir değil, 200 kayıt ekleyin.
- Olumlu, olumsuz ve kısıtlı kullanıcı senaryolarını ele alın.
- Her zaman anlamlı System.assert ifadeleri ekleyin; doğrulama ifadeleri olmadan kapsama alanı hiçbir şeyi kanıtlamaz.
Apex En İyi Uygulamaları
Yeni başlayanlar genellikle tek bir kayıt için çalışan ancak gerçek dünyadaki toplu işlemlerde başarısız olan Apex kodları yazarlar. Aşağıdaki uygulamalar, kodunuzun sınırlayıcı parametreler içinde kalmasını ve bakımının daha kolay olmasını sağlar:
- Her şeyi toplu işlemle halledin: Tetikleyiciler tek seferde 200'e kadar kayıt alabileceğinden, kayıt koleksiyonlarını işleyen bir mantık yazın.
- SOQL ve DML'yi döngülerin dışında tutun: Döngüden önce sorguyu çalıştırın, değişiklikleri bir listede toplayın ve döngüden sonra tek bir DML ifadesi gerçekleştirin.
- Nesne başına bir tetikleyici: Tetikleyicileri mantıktan arındırın ve işi işleyici sınıflara devredin; bu, yürütme sırasını tahmin edilebilir hale getirir.
- Paylaşım özelliğiyle kullanın: Sistem bağlamında çalıştırmak için belgelenmiş bir neden olmadığı sürece, kayıt düzeyinde güvenlik uygulayın.
- Kimlik numaralarını doğrudan kodlamaktan kaçının: Kayıt kimlikleri test ortamları ve üretim ortamları arasında farklılık gösterir, bu nedenle bunları sorgulayın veya bunun yerine Özel Meta Verileri kullanın.
- Kod içindeki izleme limitleri: Limits sınıfının Limits.getQueries() gibi yöntemleri, çalışma zamanında kaynak tüketimini kontrol etmenizi sağlar.
👍 Bahşiş: Kodunuzu dağıtmadan önce bir test ortamında 200 kayıt üzerinde çalıştırın. Çoğu sınır hatası yalnızca yüksek hacimli işlemlerde ortaya çıkar ve bunları erken yakalamak, üretim ortamında hata ayıklamaktan çok daha ucuzdur.






