Salesforce Triggerları - Salesforce (2)

Salesforce Triggerları - Salesforce (2)

2015, Oct 23    

Bugün Apex trigger yazımını anlatacağım. Trigger nedir ne değildir onunla başlayalım önce. Salesforce’da insert, update ve delete işlemlerinin öncesinde ve sonrasında (before/after) istenen işlemleri yapabilmek için yazdığımız yapıya trigger diyoruz.

Diyelim ki Account nesnemiz insert edilirken (before) eğer Name alanı ‘Tuğçe’ ye eşitse Test__c alanımızda da Tuğçe yazsın. Burada akışımız şu şekilde ilerliyor. Account tipinde a kaydı insert işlemi başlar –> Name == Tuğçe koşulu kontrol edilir –> Eğer doğruysa a.Test__c = a.Name yapılır.

Dikkat ettiyseniz burada tekrar bir update işlemi uygulamadık. Çünkü before triggerlarında henüz veritabanına kayıt kaydedilmediği için update etmemize gerek kalmadı. Zaten Triggerın içeriğinde olan nesneler before triggerlarında insert/update ya da delete edilemezler.

Triggerlar Salesforce’da tıklama ile yapılamayacak durumlarda kullanılmalıdır. (Salesforce’taki tıklama yapıları sonraki yazılarımdan birilerinde olacaktır.) Triggerları isteğe göre aktif ya da inaktif yapabiliriz. Ayrıca production dediğimiz canlı ortama taşınacak trigger kodları %1 bile olsa code coverage dediğimiz testlere sahip olmalıdır. Salesforce’da unit testleri burada anlatmıştım.

Basit bir trigger yazalım şimdi.

trigger UpdateTest on Account (before insert) {
    List<Account> accounts = Trigger.new; //yeni insert edilen Account nesneleri

    For(Account a :accounts){
      if(a.Name == 'Tuğçe') a.Test__c = a.Name;
    }
}

Yukarda bahsettiğimiz akışın algoritması bu şekilde yazılıyor. Şimdi burada Trigger.new dedik. Bu Trigger.new yeni insert edilen Account tipindeki kayıtları getiriyor.

Trigger.new - > yeni kayıtlar
Trigger.old - > update/delete edilmeden önceki halleri
Trigger.newMap - > yeni kayıtların idleri ile map edilmiş halleri
Trigger.oldMap - > update/delete edilmeden önceki kayıtların idleri ile map edilmiş halleri

Bunlar bizim kodda toplu halde işlem yapabilmemizi kolaylaştırır. Salesforce’ta çok fazla limit olduğu için bu limitlere çok yaklaşmamızı da sağlar.

Diyelim ki triggerımız before insert ve after update durumları için geçerli olsun. Bu insert ve delete , before ve after durumları için kodu nasıl ayıracağız?

trigger UpdateTest on Account (before insert, before update) {
  if(Trigger.isBefore){
    List<Account> accounts = Trigger.new; //yeni insert edilen Account nesneleri

    For(Account a :accounts){
      if(a.Name == 'Tuğçe') a.Test__c = a.Name;
    }
  }else if(Trigger.isAfter){
    //after kodu
  }
}

ya da

trigger UpdateTest on Account (before insert, before update) {
  if(Trigger.isInsert){
    List<Account> accounts = Trigger.new; //yeni insert edilen Account nesneleri

    For(Account a :accounts){
      if(a.Name == 'Tuğçe') a.Test__c = a.Name;
    }
  }else if(Trigger.isUpdate){
    //update kodu
  }
}

isInsert, isUpdate, isDelete, isBefore, isAfter bizim tek bir triggerda farklı koşullar için işlemler yapabilmemizi sağlar. Salesforce’ta trigger yazımı kısa böyle. Daha detaylı öğrenmek isteyen arkadaşları Trailhead e davet ediyorum. Trailhead, aynı Codecademy gibi adım adım ilerleyerek öğrenmeyi sağlayan bir araç. (Codecademy ne diye sormayın n’olursunuz…) İlgileniyorsanız bakmanızı tavsiye ederim.