Apex - Hızlı Kılavuz
Apex nedir?
Apex, Salesforce.com tarafından geliştirilmiş özel bir dildir. Resmi tanıma göre Apex, geliştiricilerin Force.com platform sunucusunda Force.com API'ye yapılan çağrılarla birlikte akış ve işlem kontrol ifadelerini yürütmesine olanak tanıyan, güçlü bir şekilde yazılmış, nesne yönelimli bir programlama dilidir.
Java benzeri bir sözdizimine sahiptir ve veritabanında depolanan prosedürler gibi davranır. Geliştiricilerin, düğme tıklamaları, ilgili kayıt güncellemeleri ve Visualforce dahil olmak üzere çoğu sistem olayına iş mantığı eklemesini sağlarpages.Apexkod, Web hizmeti talepleri tarafından ve nesneler üzerindeki tetikleyicilerden başlatılabilir. Apex; Performance Edition, Unlimited Edition, Enterprise Edition ve Developer Edition'a dahildir.
Apex'in Dil Olarak Özellikleri
Şimdi Apex'in bir Dil olarak özelliklerini tartışalım -
Birleşik
Apex, INSERT, UPDATE, DELETE ve ayrıca DML İstisna işleme gibi DML işlemlerini desteklemektedir. Satır içi SOQL ve sObject kayıt kümesini döndüren SOSL sorgu işleme desteği vardır. Sonraki bölümlerde sObject, SOQL, SOSL'yi detaylı olarak inceleyeceğiz.
Java benzeri sözdizimi ve kullanımı kolay
Apex, Java gibi sözdizimini kullandığından kullanımı kolaydır. Örneğin, değişken bildirimi, döngü sözdizimi ve koşullu ifadeler.
Verilerle Güçlü Bir Şekilde Entegre Edilir
Apex, veri odaklıdır ve birden çok sorgu ve DML ifadesini birlikte yürütmek için tasarlanmıştır. Veritabanında birden çok işlem bildirimi yayınlar.
Kesinlikle Yazılmış
Apex, güçlü bir şekilde yazılmış bir dildir. SObject gibi şema nesnelerine doğrudan başvuru kullanır ve herhangi bir geçersiz başvuru, silinirse veya yanlış veri türündeyse hızla başarısız olur.
Çok Kiracılı Ortam
Apex, çok kiracılı bir ortamda çalışır. Sonuç olarak, Apex çalışma zamanı motoru, kontrolsüz koda karşı yakından korunmak ve paylaşılan kaynakları tekeline almasını önlemek için tasarlanmıştır. Sınırları ihlal eden herhangi bir kod, anlaşılması kolay hata mesajlarıyla başarısız olur.
Otomatik Olarak Yükseltme
Apex, Salesforce sürümlerinin bir parçası olarak yükseltildi. Manuel olarak yükseltmemize gerek yok.
Kolay Test
Apex, ne kadar kodun kapsandığını ve kodunuzun hangi bölümlerinin daha verimli olabileceğini gösteren test sonuçları dahil olmak üzere birim testi oluşturma ve yürütme için yerleşik destek sağlar.
Geliştirici Ne Zaman Apex'i Seçmelidir?
Önceden oluşturulmuş ve kullanıma hazır işlevsellikleri kullanarak karmaşık iş işlevlerini uygulayamadığımızda Apex kullanılmalıdır. Salesforce yapılandırması üzerinden apex kullanmamız gereken durumlar aşağıdadır.
Apex Uygulamaları
Apex'i istediğimizde kullanabiliriz -
Diğer sistemleri entegre ederek Web hizmetleri oluşturun.
E-posta patlaması veya e-posta kurulumu için e-posta hizmetleri oluşturun.
Aynı anda birden çok nesne üzerinde karmaşık doğrulama ve ayrıca özel doğrulama uygulaması gerçekleştirin.
Mevcut iş akışı işlevselliği veya akışları tarafından desteklenmeyen karmaşık iş süreçleri oluşturun.
Kayıtları güncellemek için Veritabanı yöntemlerini kullanmak gibi özel işlem mantığı (yalnızca tek bir kayıt veya nesne ile değil, tüm işlem boyunca oluşan mantık) oluşturun.
Bir kayıt değiştirildiğinde bir mantık uygulayın veya tetikleyicinin çalışmasına neden olan bir olay olduğunda ilgili nesnenin kaydını değiştirin.
Apex'in Çalışma Yapısı
Aşağıdaki şemada gösterildiği gibi (Referans: Salesforce Geliştirici Belgeleri), Apex tamamen talep edilen Force.com Platformunda çalışır
Eylem Akışı
Geliştirici kodu kaydettiğinde ve bir son kullanıcı aşağıda gösterildiği gibi Apex kodunu çağıran bir eylem gerçekleştirdiğinde iki eylem dizisi vardır -
Geliştirici Eylemi
Bir geliştirici, Apex kodunu platforma yazıp kaydettiğinde, platform uygulama sunucusu önce kodu Apex çalışma zamanı yorumlayıcısı tarafından anlaşılabilen bir dizi talimat halinde derler ve ardından bu talimatları meta veri olarak kaydeder.
Son Kullanıcı İşlemi
Bir son kullanıcı, bir düğmeye tıklayarak veya bir Visualforce sayfasına erişerek Apex'in yürütülmesini tetiklediğinde, platform uygulama sunucusu derlenmiş talimatları meta verilerden alır ve sonucu döndürmeden önce çalışma zamanı yorumlayıcısı aracılığıyla gönderir. Son kullanıcı, standart uygulama platformu talebiyle karşılaştırıldığında yürütme süresinde hiçbir farklılık gözlemlemez.
Apex, Salesforce.com'un tescilli dili olduğundan, genel bir programlama dilinin yaptığı bazı özellikleri desteklemez. Aşağıda, Apex'in desteklemediği birkaç özellik verilmiştir -
Kullanıcı Arayüzündeki öğeleri gösteremez.
Standart SFDC tarafından sağlanan işlevselliği değiştiremezsiniz ve ayrıca standart işlevselliğin yürütülmesini engellemek mümkün değildir.
Başka dillerde de yapabildiğimiz için birden fazla iş parçacığı oluşturmak da mümkün değildir.
Apex Sözdizimini Anlamak
Apex kodu tipik olarak diğer programlama dillerinden aşina olabileceğimiz birçok şeyi içerir.
Değişken Beyanı
Kesin yazılmış bir dil olarak, Apex'teki her değişkeni veri türü ile bildirmelisiniz. Aşağıdaki kodda görüldüğü gibi (aşağıdaki ekran görüntüsü), lstAcc, veri türü ile Hesap Listesi olarak bildirilir.
SOQL Sorgusu
Bu, Salesforce veritabanından verileri almak için kullanılacaktır. Aşağıdaki ekran görüntüsünde gösterilen sorgu, Hesap nesnesinden veri alıyor.
Döngü İfadesi
Bu döngü deyimi, bir liste üzerinde yineleme yapmak veya belirli bir sayıda kod parçası üzerinde yineleme yapmak için kullanılır. Aşağıdaki ekran görüntüsünde gösterilen kodda yineleme, sahip olduğumuz kayıt sayısı ile aynı olacaktır.
Akış Kontrol Beyanı
If ifadesi, bu kodda akış denetimi için kullanılır. Belirli koşullara bağlı olarak, belirli bir kod parçasının yürütülmesine veya yürütülmesinin durdurulmasına karar verilir. Örneğin aşağıda gösterilen kodda listenin boş olup olmadığını veya kayıt içerip içermediğini kontrol etmektedir.
DML İfadesi
Veritabanındaki kayıtlar üzerinde kayıt ekleme, güncelleme, yükseltme, silme işlemlerini gerçekleştirir. Örneğin, aşağıda verilen kod, Hesapların yeni alan değeri ile güncellenmesine yardımcı olur.
Aşağıda, bir Apex kod parçacığının nasıl görüneceğine dair bir örnek verilmiştir. Tüm bu Apex programlama kavramlarını bu eğitimde daha ayrıntılı olarak inceleyeceğiz.
Bu bölümde Salesforce Apex geliştirmemizin ortamını anlayacağız. Apex geliştirme yapmak için halihazırda bir Salesforce sürümünün kurulu olduğu varsayılmaktadır.
Apex kodunu Salesforce'un Sandbox veya Developer sürümünde geliştirebilirsiniz. Sandbox organizasyonu, organizasyonunuzun, veri değiştirme veya normal işlevselliği bozma riskini almadan kod yazıp test edebileceğiniz bir kopyasıdır. Standart endüstriyel uygulamaya göre, kodu Sandbox'ta geliştirmeniz ve ardından bunu Üretim ortamına dağıtmanız gerekir.
Bu eğitim için Salesforce'un Geliştirici sürümünü kullanacağız. Geliştirici sürümünde, bir Sandbox organizasyonu oluşturma seçeneğiniz olmayacak. Sandbox özellikleri, Salesforce'un diğer sürümlerinde mevcuttur.
Apex Kod Geliştirme Araçları
Tüm sürümlerde, kodu geliştirmek için aşağıdaki üç araçtan herhangi birini kullanabiliriz:
- Force.com Geliştirici Konsolu
- Force.com IDE
- Salesforce Kullanıcı Arayüzünde Kod Düzenleyici
Note − Öğrenmek için basit ve kullanıcı dostu olduğu için kod yürütme eğitimimiz boyunca Developer Console'u kullanacağız.
Force.com Geliştirici Konsolu
Developer Console, Salesforce organizasyonunuzda uygulamaları oluşturmak, hatalarını ayıklamak ve test etmek için kullanabileceğiniz bir dizi araç içeren entegre bir geliştirme ortamıdır.
Developer Console'u açmak için şu adımları izleyin -
Step 1 − Ad → Geliştirici Konsolu'na gidin
Step 2 − "Geliştirici Konsolu" nu tıklayın ve aşağıdaki ekran görüntüsündeki gibi bir pencere görünecektir.
Aşağıda, Geliştirici Konsolu kullanılarak gerçekleştirilebilecek birkaç işlem verilmiştir.
Writing and compiling code −Kodu kaynak kodu düzenleyicisini kullanarak yazabilirsiniz. Bir tetikleyici veya sınıfı kaydettiğinizde, kod otomatik olarak derlenir. Herhangi bir derleme hatası rapor edilecektir.
Debugging −Kodu kaynak kodu düzenleyicisini kullanarak yazabilirsiniz. Bir tetikleyici veya sınıfı kaydettiğinizde, kod otomatik olarak derlenir. Herhangi bir derleme hatası rapor edilecektir.
Testing − Hata ayıklama günlüklerini görüntüleyebilir ve hata ayıklamaya yardımcı olan kontrol noktaları belirleyebilirsiniz.
Checking performance −Kuruluşunuzdaki belirli test sınıflarının veya tüm sınıfların testlerini yürütebilir ve test sonuçlarını görüntüleyebilirsiniz. Ayrıca, kod kapsamını da inceleyebilirsiniz.
SOQL queries − Performans darboğazlarını bulmak için hata ayıklama günlüklerini inceleyebilirsiniz.
Color coding and autocomplete − Kaynak kodu düzenleyicisi, kod öğelerinin daha kolay okunabilmesi için bir renk şeması kullanır ve sınıf ve yöntem adları için otomatik tamamlama sağlar.
Developer Console'da Kod Yürütme
Bu öğreticide bahsedilen tüm kod parçacıklarının geliştirici konsolunda yürütülmesi gerekir. Developer Console'daki adımları uygulamak için bu adımları izleyin.
Step 1 - Salesforce.com'a giriş yapın login.salesforce.com. Öğreticide bahsedilen kod parçacıkları kopyalayın. Şimdilik aşağıdaki örnek kodu kullanacağız.
String myString = 'MyString';
System.debug('Value of String Variable'+myString);
Step 2 - Developer Console'u açmak için Ad → Developer Console'u ve ardından aşağıda gösterildiği gibi Anonim Çalıştır'ı tıklayın.
Step 3 - Bu adımda, bir pencere açılacak ve kodu oraya yapıştırabilirsiniz.
Step 4 - Tıkladığımızda Executehata ayıklama günlükleri açılacaktır. Günlük aşağıda gösterildiği gibi pencerede göründüğünde, günlük kaydına tıklayın.
Ardından pencereye aşağıda gösterildiği gibi 'USER' yazın ve çıktı ifadesi hata ayıklama penceresinde görünecektir. Bu 'USER' ifadesi çıktıyı filtrelemek için kullanılır.
Dolayısıyla, temel olarak, bu öğreticide herhangi bir kod parçacığını yürütmek için yukarıda belirtilen tüm adımları takip edeceksiniz.
Kurumsal Uygulama Geliştirme Örneği
Eğitimimiz için, bir Kimyasal Ekipman ve İşleme Şirketi için CRM uygulamasını uygulayacağız. Bu şirket tedarikçilerle ilgilenir ve hizmet sağlar. Her kavramı ayrıntılı olarak anlamak için eğitimimiz boyunca bu örnekle ilgili küçük kod parçacıkları üzerinde çalışacağız.
Bu eğitimdeki kodu çalıştırmak için iki nesnenin oluşturulması gerekir: Müşteri ve Fatura nesneleri. Salesforce'ta bu nesneleri nasıl oluşturacağınızı zaten biliyorsanız, aşağıda verilen adımları atlayabilirsiniz. Aksi takdirde, aşağıdaki adım adım kılavuzu takip edebilirsiniz.
Müşteri Nesnesi Oluşturma
Önce Müşteri nesnesini ayarlayacağız.
Step 1- Kurulum'a gidin ve ardından aşağıda gösterildiği gibi 'Nesne'yi arayın. Ardından aşağıda gösterildiği gibi Nesneler bağlantısına tıklayın.
Step 2 - Nesne sayfası açıldıktan sonra, 'Create New Object'düğmesine aşağıda gösterildiği gibi.
Step 3- Düğmeye tıkladıktan sonra, yeni nesne oluşturma sayfası görünecek ve ardından tüm nesne ayrıntılarını aşağıya girildiği gibi girilecektir. Nesne adı Müşteri olmalıdır. Aşağıdaki ekran görüntüsünde gösterildiği gibi alana bilgileri girmeniz ve diğer varsayılan şeyleri olduğu gibi bırakmanız yeterlidir.
Bilgileri girin ve ardından 'Kaydet' düğmesine tıklayın -
Yukarıdaki adımları takip ederek Müşteri nesnesini başarıyla oluşturduk.
Müşteri nesnesi için Özel Alanlar Oluşturma
Artık Müşteri nesnemizi kurduğumuza göre, bir 'Aktif' alanı oluşturacağız ve ardından benzer adımları izleyerek diğer alanları oluşturabilirsiniz. Alanın Adı ve API adı ekran görüntüsünde verilecektir.
Step 1- Checkbox olarak veri türünde 'Aktif' adlı bir alan oluşturacağız. Kurulum'a gidin ve üzerine tıklayın.
Step 2 - Aşağıda gösterildiği gibi 'Nesne'yi arayın ve üzerine tıklayın.
Step 3 - 'Müşteri' nesnesine tıklayın.
Step 4 - Müşteri nesnesi bağlantısına tıkladığınızda ve nesne detay sayfası göründüğünde, Yeni düğmesine tıklayın.
Step 5 - Şimdi, veri türünü Onay Kutusu olarak seçin ve İleri'yi tıklayın.
Step 6 - Alan adını ve etiketini aşağıda gösterildiği gibi girin.
Step 7 - Görünür'ü ve ardından İleri'yi tıklayın.
Step 8 - Şimdi 'Kaydet'e tıklayın.
Yukarıdaki adımları takip ederek özel alanımız 'Aktif' oluşturulur. Kalan alanlar için yukarıdaki tüm özel alan oluşturma adımlarını izlemelisiniz. Bu, tüm alanlar oluşturulduktan sonra müşteri nesnesinin son görünümüdür -
Fatura Nesnesi Oluşturma
Step 1 - Kurulum'a gidin ve 'Nesne'yi arayın ve ardından aşağıda gösterildiği gibi Nesneler bağlantısını tıklayın.
Step 2 - Nesne sayfası açıldıktan sonra, aşağıda gösterildiği gibi 'Yeni Nesne Oluştur' düğmesine tıklayın.
Step 3- Düğmeye tıkladıktan sonra, aşağıdaki ekran görüntüsünde gösterildiği gibi yeni nesne oluşturma sayfası görünecektir. Ayrıntıları buraya girmeniz gerekiyor. Nesne adı Fatura olmalıdır. Bu, bu eğiticide daha önce Müşteri nesnesini nasıl oluşturduğumuza benzer.
Step 4 - Aşağıda gösterildiği gibi bilgileri girin ve ardından 'Kaydet' düğmesine tıklayın.
Bu adımları takip ederek, Fatura nesneniz oluşturulacaktır.
Fatura nesnesi için Özel Alanlar oluşturma
Fatura nesnesi üzerinde aşağıda gösterildiği gibi Açıklama alanını oluşturacağız -
Step 1 - Kurulum'a gidin ve üzerine tıklayın.
Step 2 - Aşağıda gösterildiği gibi 'Nesne'yi arayın ve üzerine tıklayın.
Step 3 - 'Fatura' nesnesine tıklayın.
Ve sonra 'Yeni'yi tıklayın.
Step 4 - Veri türünü Metin Alanı olarak seçin ve ardından İleri düğmesine tıklayın.
Step 5 - Bilgileri aşağıda verilen şekilde girin.
Step 6 - Görünür'ü ve ardından İleri'yi tıklayın.
Step 7 - Kaydet'e tıklayın.
Benzer şekilde, Fatura nesnesindeki diğer alanları da oluşturabilirsiniz.
Bununla, bu eğitim için gerekli olan nesneleri oluşturduk. Sonraki bölümlerde bu nesnelere dayalı olarak çeşitli örnekler öğreneceğiz.
Veri Türlerini Anlamak
Apex dili güçlü bir şekilde yazılmıştır, bu nedenle Apex'teki her değişken belirli veri türleriyle bildirilecektir. Tüm apeks değişkenleri başlangıçta null olarak başlatılır. Bir geliştiricinin değişkenlere uygun değerlerin atandığından emin olması her zaman önerilir. Aksi takdirde, bu tür değişkenler kullanıldığında, boş işaretçi istisnaları veya işlenmeyen istisnalar atar.
Apex, aşağıdaki veri türlerini destekler -
İlkel (Tamsayı, Çift, Uzun, Tarih, Tarih Saat, Dize, Kimlik veya Boole)
Koleksiyonlar (Listeler, Kümeler ve Haritalar) (6. Bölümde ele alınacaktır)
sObject
Enums
Sınıflar, Nesneler ve Arayüzler (Bölüm 11, 12 ve 13'te ele alınacaktır)
Bu bölümde, tüm İlkel Veri Türlerine, Nesnelere ve Enumlara bakacağız. Bireysel olarak öğrenilmesi gereken anahtar konular olduğu için ilerleyen bölümlerde Koleksiyonlar, Sınıflar, Nesneler ve Arayüzlere bakacağız.
İlkel Veri Türleri
Bu bölümde, Apex tarafından desteklenen İlkel Veri Türlerini tartışacağız.
Tamsayı
Herhangi bir ondalık nokta içermeyen 32 bitlik bir sayı. Bunun değer aralığı -2.147.483.648'den başlar ve maksimum değer 2.147.483.647'ye kadardır.
Example
Kimyasal işleme tesisinin alıcısına sevk edilmesi gereken varil miktarını saklayacak bir değişken beyan etmek istiyoruz.
Integer barrelNumbers = 1000;
system.debug(' value of barrelNumbers variable: '+barrelNumbers);
System.debug() işlev değişkenin değerini yazdırır, böylece bunu hata ayıklamak veya değişkenin şu anda hangi değeri tuttuğunu öğrenmek için kullanabiliriz.
Yukarıdaki kodu Geliştirici konsoluna yapıştırın ve Yürüt'ü tıklayın. Günlükler oluşturulduktan sonra, "barrelNumbers" değişkeninin değerini 1000 olarak gösterecektir.
Boole
Bu değişken doğru, yanlış veya boş olabilir. Çoğu zaman, bu tür bir değişken, belirli koşulun ayarlanıp ayarlanmadığını belirlemek için programlamada bayrak olarak kullanılabilir.
Example
Gönderilen Boole gönderi doğru olarak ayarlanacaksa, şu şekilde bildirilebilir:
Boolean shipmentDispatched;
shipmentDispatched = true;
System.debug('Value of shipmentDispatched '+shipmentDispatched);
Tarih
Bu değişken türü bir tarihi belirtir. Bu sadece tarihi saklayabilir, saati değil. Tarihi zamanla birlikte kaydetmek için, onu DateTime değişkeninde saklamamız gerekecek.
Example
Date değişkeninin nasıl çalıştığını anlamak için aşağıdaki örneği düşünün.
//ShipmentDate can be stored when shipment is dispatched.
Date ShipmentDate = date.today();
System.debug('ShipmentDate '+ShipmentDate);
Uzun
Bu, ondalık noktası olmayan 64 bitlik bir sayıdır. Bu, Tamsayı tarafından sağlananlardan daha geniş bir değer aralığına ihtiyacımız olduğunda kullanılır.
Example
Şirket geliri depolanacaksa, veri türünü Uzun olarak kullanacağız.
Long companyRevenue = 21474838973344648L;
system.debug('companyRevenue'+companyRevenue);
Nesne
Buna Apex'te desteklenen herhangi bir veri türü diyebiliriz. Örneğin, Sınıf değişkeni bu sınıfın nesnesi olabilir ve sObject genel türü de bir nesnedir ve benzer şekilde Hesap gibi belirli nesne türü de bir Nesnedir.
Example
Bject değişkeninin nasıl çalıştığını anlamak için aşağıdaki örneği düşünün.
Account objAccount = new Account (Name = 'Test Chemical');
system.debug('Account value'+objAccount);
Note - Aşağıda belirtildiği gibi önceden tanımlanmış bir sınıf nesnesi de oluşturabilirsiniz -
//Class Name: MyApexClass
MyApexClass classObj = new MyApexClass();
Bu, sınıf değişkeni olarak kullanılacak sınıf nesnesidir.
Dize
Dize, tek tırnak içindeki herhangi bir karakter kümesidir. Karakter sayısı için herhangi bir sınırlama yoktur. Burada yığın boyutu karakter sayısını belirlemek için kullanılacaktır. Bu, Apex programı tarafından kaynakların tekeline bir sınır koyar ve ayrıca çok fazla büyümemesini sağlar.
Example
String companyName = 'Abc International';
System.debug('Value companyName variable'+companyName);
Zaman
Bu değişken, belirli bir zamanı saklamak için kullanılır. Bu değişken her zaman sistem statik yöntemiyle bildirilmelidir.
Blob
Blob, nesne olarak depolanan bir İkili veri koleksiyonudur. Bu, eki salesforce'ta bir değişkene saklamak istediğimizde kullanılacaktır. Bu veri türü, ekleri tek bir nesneye dönüştürür. Blob bir dizeye dönüştürülecekse, bunun için toString ve valueOf yöntemlerini kullanabiliriz.
sObject
Bu, Salesforce'ta özel bir veri türüdür. SQL'deki bir tabloya benzer ve SQL'deki sütunlara benzer alanlar içerir. İki tür nesne vardır - Standart ve Özel.
Örneğin, Hesap standart bir sObject ve diğer herhangi bir kullanıcı tanımlı nesne (oluşturduğumuz Müşteri nesnesi gibi) bir Özel sObject'tir.
Example
//Declaring an sObject variable of type Account
Account objAccount = new Account();
//Assignment of values to fields of sObjects
objAccount.Name = 'ABC Customer';
objAccount.Description = 'Test Account';
System.debug('objAccount variable value'+objAccount);
//Declaring an sObject for custom object APEX_Invoice_c
APEX_Customer_c objCustomer = new APEX_Customer_c();
//Assigning value to fields
objCustomer.APEX_Customer_Decscription_c = 'Test Customer';
System.debug('value objCustomer'+objCustomer);
Sıralama
Enum, belirtilen tanımlayıcılardan oluşan sonlu bir kümenin bir değerini depolayan soyut bir veri türüdür. Bir Enum tanımlamak için Enum anahtar sözcüğünü kullanabilirsiniz. Enum, Salesforce'ta başka herhangi bir veri türü olarak kullanılabilir.
Example
Aşağıdaki kodu çalıştırarak Kimyasal Bileşiğin olası adlarını bildirebilirsiniz -
//Declaring enum for Chemical Compounds
public enum Compounds {HCL, H2SO4, NACL, HG}
Compounds objC = Compounds.HCL;
System.debug('objC value: '+objC);
Java ve Apex birçok yönden benzerdir. Java ve Apex'teki değişken bildirimi de oldukça aynıdır. Yerel değişkenlerin nasıl beyan edileceğini anlamak için birkaç örnek tartışacağız.
String productName = 'HCL';
Integer i = 0;
Set<string> setOfProducts = new Set<string>();
Map<id, string> mapOfProductIdToName = new Map<id, string>();
Tüm değişkenlere null değerinin atandığına dikkat edin.
Declaring Variables
Apex'teki değişkenleri String ve Integer gibi aşağıdaki gibi tanımlayabilirsiniz -
String strName = 'My String'; //String variable declaration
Integer myInteger = 1; //Integer variable declaration
Boolean mtBoolean = true; //Boolean variable declaration
Apex variables are Case-Insensitive
Bu, aşağıda verilen kodun 'm' değişkeni iki kez bildirildiği için bir hata atacağı ve her ikisinin de aynı şekilde değerlendirileceği anlamına gelir.
Integer m = 100;
for (Integer i = 0; i<10; i++) {
integer m = 1; //This statement will throw an error as m is being declared
again
System.debug('This code will throw error');
}
Scope of Variables
Bir Apex değişkeni, kodda bildirildiği noktadan itibaren geçerlidir. Bu nedenle, aynı değişkenin tekrar ve kod bloğunda yeniden tanımlanmasına izin verilmez. Ayrıca, bir yöntemde herhangi bir değişkeni bildirirseniz, bu değişken kapsamı yalnızca o belirli yöntemle sınırlı olacaktır. Bununla birlikte, sınıf değişkenlerine sınıf boyunca erişilebilir.
Example
//Declare variable Products
List<string> Products = new List<strings>();
Products.add('HCL');
//You cannot declare this variable in this code clock or sub code block again
//If you do so then it will throw the error as the previous variable in scope
//Below statement will throw error if declared in same code block
List<string> Products = new List<strings>();
Diğer herhangi bir programlama dilinde olduğu gibi Apex'teki dize, karakter sınırı olmayan herhangi bir karakter kümesidir.
Example
String companyName = 'Abc International';
System.debug('Value companyName variable'+companyName);
Dize Yöntemleri
Salesforce'taki string sınıfının birçok yöntemi vardır. Bu bölümde en önemli ve en sık kullanılan dizi yöntemlerinden bazılarına bir göz atacağız.
içerir
Verilen dizge belirtilen alt dizeyi içeriyorsa bu yöntem true döndürür.
Syntax
public Boolean contains(String substring)
Example
String myProductName1 = 'HCL';
String myProductName2 = 'NAHCL';
Boolean result = myProductName2.contains(myProductName1);
System.debug('O/p will be true as it contains the String and Output is:'+result);
eşittir
Bu yöntem, verilen dizge ve yöntemde iletilen dize aynı ikili karakter dizisine sahipse ve boş değilse doğru döndürür. SFDC kayıt kimliğini de bu yöntemi kullanarak karşılaştırabilirsiniz. Bu yöntem büyük / küçük harfe duyarlıdır.
Syntax
public Boolean equals(Object string)
Example
String myString1 = 'MyString';
String myString2 = 'MyString';
Boolean result = myString2.equals(myString1);
System.debug('Value of Result will be true as they are same and Result is:'+result);
equalsIgnoreCase
StringtoCompare verilen dizeyle aynı karakter dizisine sahipse bu yöntem true değerini döndürür. Ancak bu yöntem büyük / küçük harfe duyarlı değildir.
Syntax
public Boolean equalsIgnoreCase(String stringtoCompare)
Example
Aşağıdaki kod, büyük / küçük harf duyarlılığını göz ardı ederek, dize karakterleri ve sıra aynı olduğundan true değerini döndürür.
String myString1 = 'MySTRING';
String myString2 = 'MyString';
Boolean result = myString2.equalsIgnoreCase(myString1);
System.debug('Value of Result will be true as they are same and Result is:'+result);
Kaldırmak
Bu yöntem, stringToRemove'da sağlanan dizeyi verilen dizeden kaldırır. Bu, dizeden bazı belirli karakterleri kaldırmak istediğinizde ve kaldırılacak karakterlerin tam dizinini bilmediğinizde kullanışlıdır. Bu yöntem, büyük / küçük harfe duyarlıdır ve aynı karakter dizisi oluşursa ancak büyük / küçük harf farklıysa çalışmaz.
Syntax
public String remove(String stringToRemove)
Example
String myString1 = 'This Is MyString Example';
String stringToRemove = 'MyString';
String result = myString1.remove(stringToRemove);
System.debug('Value of Result will be 'This Is Example' as we have removed the MyString
and Result is :'+result);
removeEndIgnoreCase
Bu yöntem, stringToRemove'da sağlanan dizeyi verilen dizeden kaldırır, ancak yalnızca sonunda ortaya çıkarsa. Bu yöntem büyük / küçük harfe duyarlı değildir.
Syntax
public String removeEndIgnoreCase(String stringToRemove)
Example
String myString1 = 'This Is MyString EXAMPLE';
String stringToRemove = 'Example';
String result = myString1.removeEndIgnoreCase(stringToRemove);
System.debug('Value of Result will be 'This Is MyString' as we have removed the 'Example'
and Result is :'+result);
ile başlar
Verilen dize, yöntemde sağlanan önekle başlıyorsa bu yöntem true döndürür.
Syntax
public Boolean startsWith(String prefix)
Example
String myString1 = 'This Is MyString EXAMPLE';
String prefix = 'This';
Boolean result = myString1.startsWith(prefix);
System.debug(' This will return true as our String starts with string 'This' and the
Result is :'+result);
Apex'teki diziler temelde Apex'teki Listelerle aynıdır. Diziler ve Listeler arasında mantıksal bir ayrım yoktur çünkü dahili veri yapıları ve yöntemleri aynıdır, ancak dizi sözdizimi Java gibi biraz gelenekseldir.
Aşağıda bir Ürün Dizisinin temsili verilmiştir -
Index 0 - HCL
Index 1 - H2SO4
Index 2 - NACL
Index 3 - H2O
Index 4 - N2
Index 5 - U296
Sözdizimi
<String> [] arrayOfProducts = new List<String>();
Misal
Diyelim ki, Ürünlerimizin adını saklamamız gerekiyor - Diziyi nerede kullanabiliriz, Ürün Adlarını aşağıda gösterildiği gibi saklayacağız. Dizini belirterek belirli Ürüne erişebilirsiniz.
//Defining array
String [] arrayOfProducts = new List<String>();
//Adding elements in Array
arrayOfProducts.add('HCL');
arrayOfProducts.add('H2SO4');
arrayOfProducts.add('NACL');
arrayOfProducts.add('H2O');
arrayOfProducts.add('N2');
arrayOfProducts.add('U296');
for (Integer i = 0; i<arrayOfProducts.size(); i++) {
//This loop will print all the elements in array
system.debug('Values In Array: '+arrayOfProducts[i]);
}
Dizin kullanarak dizi öğesine erişim
Aşağıda gösterildiği gibi dizini kullanarak dizideki herhangi bir öğeye erişebilirsiniz -
//Accessing the element in array
//We would access the element at Index 3
System.debug('Value at Index 3 is :'+arrayOfProducts[3]);
Diğer herhangi bir programlama dilinde olduğu gibi, Sabitler, bir değer bildirildikten veya atandıktan sonra değerlerini değiştirmeyen değişkenlerdir.
Apex'te Sabitler, program çalışması boyunca sabit bir değere sahip olması gereken değişkenleri tanımlamak istediğimizde kullanılır. Apex sabitleri 'final' anahtar kelimesiyle bildirilir.
Misal
Bir düşünün CustomerOperationClass sınıf ve sabit bir değişken regularCustomerDiscount içinde -
public class CustomerOperationClass {
static final Double regularCustomerDiscount = 0.1;
static Double finalPrice = 0;
public static Double provideDiscount (Integer price) {
//calculate the discount
finalPrice = price - price * regularCustomerDiscount;
return finalPrice;
}
}
Yukarıdaki sınıfın Çıktısını görmek için, Developer Console Anonim Penceresinde aşağıdaki kodu çalıştırmanız gerekir -
Double finalPrice = CustomerOperationClass.provideDiscount(100);
System.debug('finalPrice '+finalPrice);
Karar verme yapıları, programcının, program tarafından değerlendirilecek veya test edilecek bir veya daha fazla koşulu, koşulun doğru olduğu belirlenirse yürütülecek bir ifade veya ifadeyle birlikte belirtmesini ve isteğe bağlı olarak, eğer durum yanlış olarak belirlenir.
Bu bölümde, Apex'teki karar verme ve koşullu ifadelerin temel ve gelişmiş yapısını inceleyeceğiz. Karar verme, belirli koşullar karşılandığında veya karşılanmadığında yürütme akışını kontrol etmek için gereklidir. Aşağıda, programlama dillerinin çoğunda bulunan tipik bir karar verme yapısının genel biçimi verilmiştir.
Sr.No. | Açıklama ve Açıklama |
---|---|
1 | eğer ifadesi Bir if ifadesi, bir veya daha fazla ifadenin izlediği bir Boole ifadesinden oluşur. |
2 | if ... else ifadesi Bir if ifadesinin ardından isteğe bağlı bir else Boolean ifadesi yanlış olduğunda yürütülen ifade. |
3 | if ... elseif ... else ifadesi Bir if ifadesinin ardından isteğe bağlı bir else if...else tek if ... else if ifadesi kullanarak çeşitli koşulları test etmek için çok kullanışlıdır. |
4 | yuvalanmış if ifadesi Birini kullanabilirsin if or else if bir başkasının içinde ifade if or else if beyan (lar). |
Döngüler, belirli bir kod parçasının istenen sayıda yineleme ile tekrarlanması gerektiğinde kullanılır. Apex, standart geleneksel for döngüsünü ve diğer gelişmiş Döngü türlerini destekler. Bu bölümde Apex'teki Döngüler hakkında ayrıntılı olarak tartışacağız.
Bir döngü deyimi, bir deyimi veya deyim grubunu birden çok kez yürütmemize izin verir ve aşağıdaki programlama dillerinin çoğunda bir döngü deyiminin genelidir -
Aşağıdaki tablolar, Apex Programlama dilinde döngü gereksinimlerini karşılayan farklı Döngüleri listelemektedir. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
Sr.No. | Döngü Tipi ve Açıklaması |
---|---|
1 | döngü için Bu döngü, bir kayıt kümesindeki her öğe için bir dizi ifade gerçekleştirir. |
2 | Döngü için SOQL Döndürülen set o SOQL sorgusu üzerinde doğrudan bir ifade dizisi yürütün. |
3 | Java benzeri döngü Geleneksel Java benzeri sözdiziminde bir dizi ifadeyi yürütün. |
4 | döngü sırasında Belirli bir koşul doğruyken bir ifadeyi veya ifade grubunu tekrarlar. Döngü gövdesini çalıştırmadan önce koşulu test eder. |
5 | döngü sırasında yap Döngü gövdesinin sonundaki koşulu test etmesi dışında bir while ifadesi gibi. |
Koleksiyonlar, birden çok sayıda kaydı saklayabilen bir değişken türüdür. Örneğin, Liste, birden çok sayıda Hesap nesnesinin kaydını saklayabilir. Şimdi tüm koleksiyon türlerine ayrıntılı bir genel bakışa sahip olalım.
Listeler
Liste, herhangi bir sayıda ilkel, koleksiyon, sObject, kullanıcı tanımlı ve Apex türünde yerleşik kayıt içerebilir. Bu, en önemli toplama türlerinden biridir ve ayrıca, List ile kullanılmak üzere özel olarak uyarlanmış bazı sistem yöntemlerine sahiptir. Liste dizini her zaman 0 ile başlar. Bu, Java'daki diziyle eş anlamlıdır. 'Liste' anahtar kelimesiyle bir liste bildirilmelidir.
Example
Aşağıda, şehirlerin listesi olan ilkel bir veri türünün (dizge) listesini içeren liste bulunmaktadır.
List<string> ListOfCities = new List<string>();
System.debug('Value Of ListOfCities'+ListOfCities);
Listenin başlangıç değerlerinin bildirilmesi isteğe bağlıdır. Ancak, başlangıç değerlerini burada açıklayacağız. Aşağıda aynı şeyi gösteren bir örnek yer almaktadır.
List<string> ListOfStates = new List<string> {'NY', 'LA', 'LV'};
System.debug('Value ListOfStates'+ListOfStates);
Hesap Listesi (sObject)
List<account> AccountToDelete = new List<account> (); //This will be null
System.debug('Value AccountToDelete'+AccountToDelete);
İç içe geçmiş Listeyi de ilan edebiliriz. Beş seviyeye kadar çıkabilir. Buna Çok Boyutlu liste denir.
Bu, tam sayılar kümesinin listesidir.
List<List<Set<Integer>>> myNestedList = new List<List<Set<Integer>>>();
System.debug('value myNestedList'+myNestedList);
Liste herhangi bir sayıda kayıt içerebilir, ancak performans sorununu önlemek ve kaynakları tekeline almak için yığın boyutunda bir sınırlama vardır.
Listeler için Yöntemler
Listeler için, Listenin boyutunu hesaplamak, bir öğe eklemek, vb. Gibi bazı işlevleri elde etmek için programlama sırasında kullanabileceğimiz yöntemler vardır.
Aşağıda en sık kullanılan yöntemlerden bazıları verilmiştir -
- size()
- add()
- get()
- clear()
- set()
Aşağıdaki örnek, tüm bu yöntemlerin kullanımını göstermektedir
// Initialize the List
List<string> ListOfStatesMethod = new List<string>();
// This statement would give null as output in Debug logs
System.debug('Value of List'+ ListOfStatesMethod);
// Add element to the list using add method
ListOfStatesMethod.add('New York');
ListOfStatesMethod.add('Ohio');
// This statement would give New York and Ohio as output in Debug logs
System.debug('Value of List with new States'+ ListOfStatesMethod);
// Get the element at the index 0
String StateAtFirstPosition = ListOfStatesMethod.get(0);
// This statement would give New York as output in Debug log
System.debug('Value of List at First Position'+ StateAtFirstPosition);
// set the element at 1 position
ListOfStatesMethod.set(0, 'LA');
// This statement would give output in Debug log
System.debug('Value of List with element set at First Position' + ListOfStatesMethod[0]);
// Remove all the elements in List
ListOfStatesMethod.clear();
// This statement would give output in Debug log
System.debug('Value of List'+ ListOfStatesMethod);
Aşağıda verildiği gibi, Listeyi bildirmek için dizi gösterimini de kullanabilirsiniz, ancak bu Apex programlamada genel bir uygulama değildir -
String [] ListOfStates = new List<string>();
Setleri
Bir Küme, birden çok sayıda sıralanmamış benzersiz kayıt içeren bir koleksiyon türüdür. Bir Setin yinelenen kayıtları olamaz. Listeler gibi Setler de yuvalanabilir.
Example
Firmanın sattığı ürün setini tanımlayacağız.
Set<string> ProductSet = new Set<string>{'Phenol', 'Benzene', 'H2SO4'};
System.debug('Value of ProductSet'+ProductSet);
Kümeler için Yöntemler
Set, aşağıda gösterildiği gibi programlama sırasında kullanabileceğimiz yöntemleri destekliyor (yukarıdaki örneği genişletiyoruz) -
// Adds an element to the set
// Define set if not defined previously
Set<string> ProductSet = new Set<string>{'Phenol', 'Benzene', 'H2SO4'};
ProductSet.add('HCL');
System.debug('Set with New Value '+ProductSet);
// Removes an element from set
ProductSet.remove('HCL');
System.debug('Set with removed value '+ProductSet);
// Check whether set contains the particular element or not and returns true or false
ProductSet.contains('HCL');
System.debug('Value of Set with all values '+ProductSet);
Haritalar
Her bir değer için benzersiz anahtarı içeren bir anahtar değer çiftidir. Hem anahtar hem de değer herhangi bir veri türünde olabilir.
Example
Aşağıdaki örnek, Ürün Adı ile Ürün kodunun haritasını temsil eder.
// Initialize the Map
Map<string, string> ProductCodeToProductName = new Map<string, string>
{'1000'=>'HCL', '1001'=>'H2SO4'};
// This statement would give as output as key value pair in Debug log
System.debug('value of ProductCodeToProductName'+ProductCodeToProductName);
Haritalar için Yöntemler
Aşağıda, Harita ile kullanılabilecek yöntemleri gösteren birkaç örnek verilmiştir -
// Define a new map
Map<string, string> ProductCodeToProductName = new Map<string, string>();
// Insert a new key-value pair in the map where '1002' is key and 'Acetone' is value
ProductCodeToProductName.put('1002', 'Acetone');
// Insert a new key-value pair in the map where '1003' is key and 'Ketone' is value
ProductCodeToProductName.put('1003', 'Ketone');
// Assert that the map contains a specified key and respective value
System.assert(ProductCodeToProductName.containsKey('1002'));
System.debug('If output is true then Map contains the key and output is:'
+ ProductCodeToProductName.containsKey('1002'));
// Retrieves a value, given a particular key
String value = ProductCodeToProductName.get('1002');
System.debug('Value at the Specified key using get function: '+value);
// Return a set that contains all of the keys in the map
Set SetOfKeys = ProductCodeToProductName.keySet();
System.debug('Value of Set with Keys '+SetOfKeys);
Harita değerleri sıralanmamış olabilir ve bu nedenle değerlerin saklanma sırasına güvenmemeli ve haritaya her zaman tuşları kullanarak erişmeye çalışmamalıyız. Harita değeri boş olabilir. Dize bildirildiğinde eşleme anahtarları büyük / küçük harfe duyarlıdır; örneğin, ABC ve abc farklı anahtarlar olarak kabul edilecek ve benzersiz olarak değerlendirilecektir.
Sınıf nedir?
Sınıf, nesnelerin oluşturulduğu bir şablon veya plandır. Bir nesne, bir sınıfın bir örneğidir. Bu, Class'ın standart tanımıdır. Apex Sınıfları, Java Sınıflarına benzer.
Örneğin, InvoiceProcessorsınıfı, Fatura üzerinde gerçekleştirilebilecek tüm yöntemleri ve eylemleri içeren sınıfı tanımlar. Bu sınıfın bir örneğini oluşturursanız, şu anda bağlamda olan tek faturayı temsil edecektir.
Sınıf Oluşturma
Developer Console, Force.com Eclipse IDE ve Apex Class ayrıntı sayfasından da Apex'te sınıf oluşturabilirsiniz.
Developer Console'dan
Developer Console'dan bir Apex sınıfı oluşturmak için şu adımları izleyin -
Step 1 - Ad'a gidin ve Developer Console'u tıklayın.
Step 2 - Dosya ⇒ Yeni'ye ve ardından Apex sınıfına tıklayın.
Force.com IDE'den
Force.com IDE'den bir sınıf oluşturmak için şu adımları izleyin -
Step 1 - Açık Force.com Eclipse IDE
Step 2 - Dosya ⇒ Yeni ⇒ Apex Sınıfı'na tıklayarak Yeni bir Proje oluşturun.
Step 3 - Sınıfın Adını girin ve Tamam'a tıklayın.
Bu yapıldıktan sonra, yeni sınıf oluşturulacaktır.
Apex Sınıfı Ayrıntı Sayfasından
Apex Sınıf Ayrıntı Sayfasından bir sınıf oluşturmak için şu adımları izleyin -
Step 1 - Ad ⇒ Kurulum'a tıklayın.
Step 2- 'Apex Sınıfı'nı arayın ve bağlantıya tıklayın. Apex Sınıfı ayrıntıları sayfasını açacaktır.
Step 3 - 'Yeni'yi tıklayın ve ardından sınıfın Adını girin ve ardından Kaydet'i tıklayın.
Apex Sınıf Yapısı
Aşağıda, Apex sınıf tanımı için örnek yapı verilmiştir.
Syntax
private | public | global
[virtual | abstract | with sharing | without sharing]
class ClassName [implements InterfaceNameList] [extends ClassName] {
// Classs Body
}
Bu tanım, erişim değiştiricileri, paylaşım modları, sınıf adı ve sınıf gövdesinin bir kombinasyonunu kullanır. Tüm bu seçeneklere daha ayrıntılı bakacağız.
Example
Aşağıda, Apex sınıf tanımı için örnek bir yapı verilmiştir -
public class MySampleApexClass { //Class definition and body
public static Integer myValue = 0; //Class Member variable
public static String myString = ''; //Class Member variable
public static Integer getCalculatedValue () {
// Method definition and body
// do some calculation
myValue = myValue+10;
return myValue;
}
}
Erişim Değiştiriciler
Özel
Erişim değiştiriciyi 'Özel' olarak bildirirseniz, bu sınıf yalnızca yerel olarak bilinecek ve bu sınıfa söz konusu parçanın dışında erişemezsiniz. Varsayılan olarak, sınıflar bu değiştiriciye sahiptir.
halka açık
Sınıfı "Genel" olarak bildirirseniz, bu, bu sınıfın kuruluşunuz ve tanımladığınız ad alanı tarafından erişilebilir olduğu anlamına gelir. Normalde, Apex sınıflarının çoğu bu anahtar kelimeyle tanımlanır.
Küresel
Sınıfı "global" olarak ilan ederseniz, bu, kuruluşunuzdan bağımsız olarak tüm apeks kodları tarafından erişilebilir olacaktır. Web hizmeti anahtar sözcüğü ile tanımlanmış bir yönteminiz varsa, kapsayıcı sınıfı global anahtar sözcükle bildirmelisiniz.
Paylaşım Modları
Şimdi farklı paylaşım modlarını tartışalım.
Paylaşımla
Bu, Salesforce'taki Apex Classes'ın özel bir özelliğidir. Bir sınıf, 'Paylaşımla' anahtar sözcüğüyle belirtildiğinde, aşağıdaki çıkarımlara sahiptir: Sınıf yürütüldüğünde, Kullanıcının erişim ayarlarına ve profil iznine saygı duyacaktır. Kullanıcı eyleminin 30 kayıt için kayıt güncellemesini tetiklediğini, ancak kullanıcının yalnızca 20 kayda erişimi olduğunu ve 10 kayda erişilemediğini varsayalım. Ardından, sınıf, kayıtları güncelleme eylemini gerçekleştiriyorsa, kullanıcının erişebildiği yalnızca 20 kayıt güncellenecek ve geri kalan 10 kayıt güncellenmeyecektir. Bu aynı zamanda Kullanıcı modu olarak da adlandırılır.
Paylaşmadan
Kullanıcının 30 kayıttan 10'una erişimi olmasa bile, Sınıf Sistem modunda çalıştığı için, yani Paylaşımsız anahtar sözcüğü ile tanımlandığı için 30 kaydın tamamı güncellenecektir. Buna Sistem Modu denir.
Gerçek
'Virtual' anahtar sözcüğünü kullanırsanız, bu sınıfın genişletilebileceğini ve geçersiz kılmalara izin verildiğini gösterir. Yöntemlerin geçersiz kılınması gerekiyorsa, sınıflar virtual anahtar sözcüğü ile bildirilmelidir.
Öz
Sınıfı 'soyut' olarak bildirirseniz, o zaman gerçek uygulamayı değil, yalnızca yöntemin imzasını içerecektir.
Sınıf Değişkenleri
Syntax
[public | private | protected | global] [final] [static] data_type
variable_name [= value]
Yukarıdaki sözdiziminde -
- Değişken veri türü ve değişken adı zorunludur
- Erişim değiştiriciler ve değer isteğe bağlıdır.
Example
public static final Integer myvalue;
Sınıf Yöntemleri
Apex'te Sınıf Yöntemleri için iki değiştirici vardır - Genel veya Korumalı. Dönüş türü yöntem için zorunludur ve eğer yöntem hiçbir şey döndürmüyorsa, dönüş türü olarak void'i belirtmelisiniz. Ayrıca yöntem için Vücut da gereklidir.
Syntax
[public | private | protected | global]
[override]
[static]
return_data_type method_name (input parameters) {
// Method body goes here
}
Sözdiziminin Açıklaması
Köşeli parantez içinde belirtilen bu parametreler isteğe bağlıdır. Ancak, aşağıdaki bileşenler önemlidir -
- return_data_type
- method_name
Sınıf Yöntemleri için Erişim Değiştiriciler
Erişim değiştiricilerini kullanarak, sınıf yöntemleri için erişim düzeyini belirtebilirsiniz. Örneğin, Genel yönteme sınıfın herhangi bir yerinden ve Sınıfın dışından erişilebilir. Özel yönteme yalnızca sınıf içinde erişilebilir. Global, tüm Apex sınıfları tarafından erişilebilir olacak ve diğer apex sınıfları tarafından erişilebilen web hizmeti yöntemi olarak gösterilebilir.
Example
//Method definition and body
public static Integer getCalculatedValue () {
//do some calculation
myValue = myValue+10;
return myValue;
}
Bu yöntemin dönüş türü Tamsayıdır ve parametre almaz.
Bir Yöntem aşağıdaki örnekte gösterildiği gibi parametrelere sahip olabilir -
// Method definition and body, this method takes parameter price which will then be used
// in method.
public static Integer getCalculatedValueViaPrice (Decimal price) {
// do some calculation
myValue = myValue+price;
return myValue;
}
Sınıf Oluşturucular
Yapıcı, sınıf planından bir nesne oluşturulduğunda çağrılan bir koddur. Sınıf adıyla aynı isme sahiptir.
Varsayılan olarak argümansız bir kurucu çağrıldığından, her sınıf için yapıcı tanımlamamız gerekmez. Oluşturucular, değişkenlerin başlatılması için veya sınıf başlatma sırasında bir işlem yapılması gerektiğinde kullanışlıdır. Örneğin, sınıf çağrıldığında belirli Tamsayı değişkenlerine 0 olarak değerler atamak isteyeceksiniz.
Example
// Class definition and body
public class MySampleApexClass2 {
public static Double myValue; // Class Member variable
public static String myString; // Class Member variable
public MySampleApexClass2 () {
myValue = 100; //initialized variable when class is called
}
public static Double getCalculatedValue () { // Method definition and body
// do some calculation
myValue = myValue+10;
return myValue;
}
public static Double getCalculatedValueViaPrice (Decimal price) {
// Method definition and body
// do some calculation
myValue = myValue+price; // Final Price would be 100+100=200.00
return myValue;
}
}
Yapıcı aracılığıyla da sınıfın yöntemini çağırabilirsiniz. Bu, görsel kuvvet denetleyicisi için Apex'i programlarken faydalı olabilir. Sınıf nesnesi oluşturulduğunda, yapıcı aşağıda gösterildiği gibi çağrılır -
// Class and constructor has been instantiated
MySampleApexClass2 objClass = new MySampleApexClass2();
Double FinalPrice = MySampleApexClass2.getCalculatedValueViaPrice(100);
System.debug('FinalPrice: '+FinalPrice);
Aşırı Yüklenen İnşaatçılar
Oluşturucular aşırı yüklenebilir, yani bir sınıf farklı parametrelerle tanımlanmış birden fazla kurucuya sahip olabilir.
Example
public class MySampleApexClass3 { // Class definition and body
public static Double myValue; // Class Member variable
public static String myString; // Class Member variable
public MySampleApexClass3 () {
myValue = 100; // initialized variable when class is called
System.debug('myValue variable with no Overaloading'+myValue);
}
public MySampleApexClass3 (Integer newPrice) { // Overloaded constructor
myValue = newPrice; // initialized variable when class is called
System.debug('myValue variable with Overaloading'+myValue);
}
public static Double getCalculatedValue () { // Method definition and body
// do some calculation
myValue = myValue+10;
return myValue;
}
public static Double getCalculatedValueViaPrice (Decimal price) {
// Method definition and body
// do some calculation
myValue = myValue+price;
return myValue;
}
}
Bu sınıfı, önceki örnekte yürüttüğümüz gibi çalıştırabilirsiniz.
// Developer Console Code
MySampleApexClass3 objClass = new MySampleApexClass3();
Double FinalPrice = MySampleApexClass3.getCalculatedValueViaPrice(100);
System.debug('FinalPrice: '+FinalPrice);
Sınıfın bir örneğine Object denir. Salesforce açısından, nesne sınıf olabilir veya bir sObject nesnesi de oluşturabilirsiniz.
Sınıftan Nesne Oluşturma
Java veya diğer nesne yönelimli programlama dillerinde yaptığınız gibi bir sınıf nesnesi oluşturabilirsiniz.
Aşağıda MyClass adında bir Class örneği verilmiştir -
// Sample Class Example
public class MyClass {
Integer myInteger = 10;
public void myMethod (Integer multiplier) {
Integer multiplicationResult;
multiplicationResult = multiplier*myInteger;
System.debug('Multiplication is '+multiplicationResult);
}
}
Bu bir örnek sınıfıdır, yani bu sınıfın değişkenlerini veya yöntemlerini çağırmak veya bunlara erişmek için bu sınıfın bir örneğini oluşturmalı ve ardından tüm işlemleri gerçekleştirebilirsiniz.
// Object Creation
// Creating an object of class
MyClass objClass = new MyClass();
// Calling Class method using Class instance
objClass.myMethod(100);
Nesne oluşturma
Nesneler, içinde verileri depoladığınız Salesforce nesneleridir. Örneğin, Firma, İlgili Kişi vb. Özel nesnelerdir. Bu nesnelerin nesne örneklerini oluşturabilirsiniz.
Aşağıda bir sObject başlatma örneği verilmiştir ve bu belirli nesnenin alanına nokta gösterimini kullanarak nasıl erişebileceğinizi ve değerleri alanlara atayabileceğinizi gösterir.
// Execute the below code in Developer console by simply pasting it
// Standard Object Initialization for Account sObject
Account objAccount = new Account(); // Object initialization
objAccount.Name = 'Testr Account'; // Assigning the value to field Name of Account
objAccount.Description = 'Test Account';
insert objAccount; // Creating record using DML
System.debug('Records Has been created '+objAccount);
// Custom sObject initialization and assignment of values to field
APEX_Customer_c objCustomer = new APEX_Customer_c ();
objCustomer.Name = 'ABC Customer';
objCustomer.APEX_Customer_Decscription_c = 'Test Description';
insert objCustomer;
System.debug('Records Has been created '+objCustomer);
Statik Başlatma
Statik yöntemler ve değişkenler, yalnızca bir sınıf yüklendiğinde başlatılır. Statik değişkenler, bir Visualforce sayfasının görünüm durumunun bir parçası olarak iletilmez.
Aşağıda Statik yöntemin yanı sıra Statik değişkene bir örnek verilmiştir.
// Sample Class Example with Static Method
public class MyStaticClass {
Static Integer myInteger = 10;
public static void myMethod (Integer multiplier) {
Integer multiplicationResult;
multiplicationResult = multiplier * myInteger;
System.debug('Multiplication is '+multiplicationResult);
}
}
// Calling the Class Method using Class Name and not using the instance object
MyStaticClass.myMethod(100);
Static Variable Use
Statik değişkenler, sınıf yüklendiğinde yalnızca bir kez başlatılır ve bu fenomen tetikleyici özyinelemeyi önlemek için kullanılabilir. Statik değişken değeri aynı yürütme bağlamında aynı olacaktır ve çalıştırılan herhangi bir sınıf, tetikleyici veya kod ona başvurabilir ve özyinelemeyi önleyebilir.
Arayüz, yöntemlerden hiçbirinin uygulanmadığı bir Apex sınıfı gibidir. Yalnızca yöntem imzalarını içerir, ancak her yöntemin gövdesi boştur. Bir arabirimi kullanmak için, başka bir sınıfın arabirimde bulunan tüm yöntemler için bir gövde sağlayarak onu uygulaması gerekir.
Arayüzler esas olarak kodunuz için soyutlama katmanı sağlamak için kullanılır. Uygulamayı yöntemin bildiriminden ayırırlar.
Kimya Şirketimizden bir örnek alalım. Premium ve Sıradan müşterilere indirim sağlamamız gerektiğini ve her ikisi için indirimlerin farklı olacağını varsayalım.
Adlı bir Arayüz oluşturacağız. DiscountProcessor.
// Interface
public interface DiscountProcessor {
Double percentageDiscountTobeApplied(); // method signature only
}
// Premium Customer Class
public class PremiumCustomer implements DiscountProcessor {
//Method Call
public Double percentageDiscountTobeApplied () {
// For Premium customer, discount should be 30%
return 0.30;
}
}
// Normal Customer Class
public class NormalCustomer implements DiscountProcessor {
// Method Call
public Double percentageDiscountTobeApplied () {
// For Premium customer, discount should be 10%
return 0.10;
}
}
Arayüzü uyguladığınızda, o Arayüzün yöntemini uygulamak zorunludur. Arayüz yöntemlerini uygulamazsanız, bir hata atar. Yöntem uygulamasını geliştirici için zorunlu kılmak istediğinizde Arabirimleri kullanmalısınız.
Batch Apex için Standart Salesforce Arayüzü
SFDC'nin Database.Batchable, Schedulable, vb. Gibi standart arabirimleri vardır. Örneğin, Database.Batchable Arabirimini uygularsanız, Arabirimde tanımlanan üç yöntemi - Başlat, Yürüt ve Bitir - uygulamalısınız.
Aşağıda, Toplu İş Durumuyla kullanıcılara e-posta gönderen, Standart Salesforce tarafından sağlanan Database.Batchable Arayüzü için bir örnek bulunmaktadır. Bu arayüzün 3 yöntemi vardır: Başlat, Çalıştır ve Bitir. Bu arayüzü kullanarak, Batchable işlevselliğini uygulayabiliriz ve ayrıca, yürütmekte olan Batch hakkında daha fazla bilgi almak ve diğer işlevleri gerçekleştirmek için kullanabileceğimiz BatchableContext değişkenini de sağlar.
global class CustomerProessingBatch implements Database.Batchable<sobject7>,
Schedulable {
// Add here your email address
global String [] email = new String[] {'[email protected]'};
// Start Method
global Database.Querylocator start (Database.BatchableContext BC) {
// This is the Query which will determine the scope of Records and fetching the same
return Database.getQueryLocator('Select id, Name, APEX_Customer_Status__c,
APEX_Customer_Decscription__c From APEX_Customer__c WHERE createdDate = today
&& APEX_Active__c = true');
}
// Execute method
global void execute (Database.BatchableContext BC, List<sobject> scope) {
List<apex_customer__c> customerList = new List<apex_customer__c>();
List<apex_customer__c> updtaedCustomerList = new List<apex_customer__c>();
for (sObject objScope: scope) {
// type casting from generic sOject to APEX_Customer__c
APEX_Customer__c newObjScope = (APEX_Customer__c)objScope ;
newObjScope.APEX_Customer_Decscription__c = 'Updated Via Batch Job';
newObjScope.APEX_Customer_Status__c = 'Processed';
// Add records to the List
updtaedCustomerList.add(newObjScope);
}
// Check if List is empty or not
if (updtaedCustomerList != null && updtaedCustomerList.size()>0) {
// Update the Records
Database.update(updtaedCustomerList); System.debug('List Size
'+updtaedCustomerList.size());
}
}
// Finish Method
global void finish(Database.BatchableContext BC) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
// get the job Id
AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors,
a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById,
a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];
System.debug('$$$ Jobid is'+BC.getJobId());
// below code will send an email to User about the status
mail.setToAddresses(email);
// Add here your email address
mail.setReplyTo('[email protected]');
mail.setSenderDisplayName('Apex Batch Processing Module');
mail.setSubject('Batch Processing '+a.Status);
mail.setPlainTextBody('The Batch Apex job processed
'+a.TotalJobItems+'batches with '+a.NumberOfErrors+'failures'+'Job Item
processed are'+a.JobItemsProcessed);
Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail});
}
// Scheduler Method to scedule the class
global void execute(SchedulableContext sc) {
CustomerProessingBatch conInstance = new CustomerProessingBatch();
database.executebatch(conInstance,100);
}
}
Bu sınıfı yürütmek için aşağıdaki kodu Developer Console'da çalıştırmanız gerekir.
CustomerProessingBatch objBatch = new CustomerProessingBatch ();
Database.executeBatch(objBatch);
Bu bölümde, Salesforce'ta farklı Veritabanı Modifikasyon İşlevlerinin nasıl gerçekleştirileceğini tartışacağız. İşlevsellikleri gerçekleştirebileceğimiz iki söz var.
DML İfadeleri
DML; ekleme, güncelleme, silme, yukarı yükleme, kayıtları geri yükleme, kayıtları birleştirme veya müşteri adaylarını dönüştürme işlemlerini gerçekleştirmek için gerçekleştirilen eylemlerdir.
Neredeyse her iş vakası veritabanındaki değişiklikleri ve modifikasyonları içerdiğinden DML, Apex'in en önemli bölümlerinden biridir.
Veritabanı Yöntemleri
DML deyimlerini kullanarak gerçekleştirebileceğiniz tüm işlemler Veritabanı yöntemleri kullanılarak da gerçekleştirilebilir. Veritabanı yöntemleri, DML işlemlerini gerçekleştirmek için kullanabileceğiniz sistem yöntemleridir. Veritabanı yöntemleri, DML İfadelerine kıyasla daha fazla esneklik sağlar.
Bu bölümde, DML İfadelerini kullanan ilk yaklaşıma bakacağız. Sonraki bölümde Veritabanı Yöntemlerine bakacağız.
DML İfadeleri
Şimdi yine Kimya tedarikçisi şirketin örneğini ele alalım. Fatura kayıtlarımızda Durum, Ödenen Tutar, Kalan Tutar, Sonraki Ödeme Tarihi ve Fatura Numarası gibi alanlar bulunmaktadır. Bugün oluşturulan ve durumu 'Beklemede' olan faturalar 'Ödenmiş' olarak güncellenmelidir.
İşlem Ekle
Veritabanında yeni kayıt oluşturmak için ekleme işlemi kullanılır. DML Ekle deyimini kullanarak herhangi bir Standart veya Özel nesnenin kayıtlarını oluşturabilirsiniz.
Example
Her gün yeni müşteri siparişleri için yeni faturalar oluşturulduğu için APEX_Invoice__c nesnesinde yeni kayıtlar oluşturabiliriz. Önce bir Müşteri kaydı oluşturacağız ve ardından bu yeni Müşteri kaydı için bir Fatura kaydı oluşturabiliriz.
// fetch the invoices created today, Note, you must have at least one invoice
// created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
// create List to hold the updated invoice records
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test ABC';
//DML for Inserting the new Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
if (objInvoice.APEX_Status__c == 'Pending') {
objInvoice.APEX_Status__c = 'Paid';
updatedInvoiceList.add(objInvoice);
}
}
// DML Statement to update the invoice status
update updatedInvoiceList;
// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);
// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;
// DML which is creating the new Invoice record which will be linked with newly
// created Customer record
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id+' and the Invoice Number is'
+ objNewInvoice.Name);
Güncelleme İşlemi
Güncelleme işlemi, mevcut kayıtlar üzerinde güncelleme yapmaktır. Bu örnekte, mevcut bir Fatura kaydının Durum alanını 'Ödendi' olarak güncelleyeceğiz.
Example
// Update Statement Example for updating the invoice status. You have to create
and Invoice records before executing this code. This program is updating the
record which is at index 0th position of the List.
// First, fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
// Update the first record in the List
invoiceList[0].APEX_Status__c = 'Pending';
updatedInvoiceList.add(invoiceList[0]);
// DML Statement to update the invoice status
update updatedInvoiceList;
// Prints the value of updated invoices
System.debug('List has been updated and updated values of records are'
+ updatedInvoiceList[0]);
Yukarı Operasyon
Yükseltme İşlemi bir güncelleme işlemi gerçekleştirmek için kullanılır ve güncellenecek kayıtlar veri tabanında yoksa yeni kayıtlar da oluşturulur.
Example
Müşteri nesnesindeki müşteri kayıtlarının güncellenmesi gerektiğini varsayalım. Zaten mevcutsa mevcut Müşteri kaydını güncelleyeceğiz, aksi takdirde yeni bir tane oluşturacağız. Bu, APEX_External_Id__c alanının değerine bağlı olacaktır. Bu alan, kayıtların mevcut olup olmadığını belirlemek için bizim alanımız olacaktır.
Note - Bu kodu çalıştırmadan önce, lütfen Müşteri nesnesinde harici Kimlik alanı değeri '12341' olan bir kayıt oluşturun ve ardından aşağıda verilen kodu yürütün -
// Example for upserting the Customer records
List<apex_customer__c> CustomerList = new List<apex_customer__c>();
for (Integer i = 0; i < 10; i++) {
apex_customer__c objcust=new apex_customer__c(name = 'Test' +i,
apex_external_id__c='1234' +i);
customerlist.add(objcust);
} //Upserting the Customer Records
upsert CustomerList;
System.debug('Code iterated for 10 times and created 9 records as one record with
External Id 12341 is already present');
for (APEX_Customer_c objCustomer: CustomerList) {
if (objCustomer.APEX_External_Id_c == '12341') {
system.debug('The Record which is already present is '+objCustomer);
}
}
İşlemi Sil
Silme işlemini DML Sil öğesini kullanarak gerçekleştirebilirsiniz.
Example
Bu durumda test amacıyla oluşturulmuş yani 'Test' ismini içeren faturaları sileceğiz.
Bu parçacığı, sınıfı oluşturmadan Geliştirici konsolundan da çalıştırabilirsiniz.
// fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';
// Inserting the Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
if (objInvoice.APEX_Status__c == 'Pending') {
objInvoice.APEX_Status__c = 'Paid';
updatedInvoiceList.add(objInvoice);
}
}
// DML Statement to update the invoice status
update updatedInvoiceList;
// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);
// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;
// DML which is creating the new record
insert objNewInvoice;
System.debug('New Invoice Id is' + objNewInvoice.id);
// Deleting the Test invoices from Database
// fetch the invoices which are created for Testing, Select name which Customer Name
// is Test.
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
WHERE APEX_Customer__r.Name = 'Test'];
// DML Statement to delete the Invoices
delete invoiceListToDelete;
System.debug('Success, '+invoiceListToDelete.size()+' Records has been deleted');
İşlemi Geri Al
Silinen ve Geri Dönüşüm Kutusu'nda bulunan kaydı silmeyi geri alabilirsiniz. Silinen kaydın sahip olduğu tüm ilişkiler de geri yüklenecektir.
Example
Önceki örnekte silinen Kayıtların geri yüklenmesi gerektiğini varsayalım. Bu, aşağıdaki örnek kullanılarak elde edilebilir. Önceki örnekteki kod, bu örnek için değiştirilmiştir.
// fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';
// Inserting the Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
if (objInvoice.APEX_Status__c == 'Pending') {
objInvoice.APEX_Status__c = 'Paid';
updatedInvoiceList.add(objInvoice);
}
}
// DML Statement to update the invoice status
update updatedInvoiceList;
// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);
// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;
// DML which is creating the new record
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id);
// Deleting the Test invoices from Database
// fetch the invoices which are created for Testing, Select name which Customer Name
// is Test.
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
WHERE APEX_Customer__r.Name = 'Test'];
// DML Statement to delete the Invoices
delete invoiceListToDelete;
system.debug('Deleted Record Count is ' + invoiceListToDelete.size());
System.debug('Success, '+invoiceListToDelete.size() + 'Records has been deleted');
// Restore the deleted records using undelete statement
undelete invoiceListToDelete;
System.debug('Undeleted Record count is '+invoiceListToDelete.size()+'. This should
be same as Deleted Record count');
Veritabanı sınıfı yöntemleri, ekleme, güncelleme, vb. Gibi DML İfadelerinden daha esnek olan DML ifadeleriyle çalışmanın başka bir yoludur.
Veritabanı Yöntemleri ve DML İfadeleri arasındaki farklar
DML İfadeleri | Veritabanı Yöntemleri |
---|---|
Kısmi Güncellemeye izin verilmiyor. Örneğin, listede 20 kaydınız varsa, tüm kayıtlar güncellenecek veya hiçbiri güncellenmeyecektir. | Kısmi güncellemeye izin verilir. Veritabanındaki Parametre yöntemini, kısmi güncellemeye izin vermek için doğru veya yanlış, doğru ve buna izin vermemek için yanlış olarak belirtebilirsiniz. |
Başarılı ve başarısız kayıtların listesini alamazsınız. | Örnekte gördüğümüz gibi başarı ve başarısız kayıtların listesini alabilirsiniz. |
Example - listName ekle | Example - Database.insert (listName, False), burada false, kısmi güncellemeye izin verilmediğini gösterir. |
İşlem Ekle
Veritabanı yöntemleriyle yeni kayıt eklemek de oldukça basit ve esnektir. DML ifadelerini kullanarak yeni kayıtlar eklediğimiz önceki senaryoyu ele alalım. Veritabanı yöntemlerini kullanarak aynısını ekleyeceğiz.
Misal
// Insert Operation Using Database methods
// Insert Customer Records First using simple DML Statement. This Customer Record will be
// used when we will create Invoice Records
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';
insert objCust; // Inserting the Customer Records
// Insert Operation Using Database methods
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
List<apex_invoice__c> InvoiceListToInsert = new List<apex_invoice__c>();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Customer__c = objCust.id;
objNewInvoice.APEX_Amount_Paid__c = 1000;
InvoiceListToInsert.add(objNewInvoice);
Database.SaveResult[] srList = Database.insert(InvoiceListToInsert, false);
// Database method to insert the records in List
// Iterate through each returned result by the method
for (Database.SaveResult sr : srList) {
if (sr.isSuccess()) {
// This condition will be executed for successful records and will fetch the ids
// of successful records
System.debug('Successfully inserted Invoice. Invoice ID: ' + sr.getId());
// Get the invoice id of inserted Account
} else {
// This condition will be executed for failed records
for(Database.Error objErr : sr.getErrors()) {
System.debug('The following error has occurred.');
// Printing error message in Debug log
System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
System.debug('Invoice oject field which are affected by the error:'
+ objErr.getFields());
}
}
}
Güncelleme İşlemi
Şimdi veritabanı yöntemlerini kullanarak iş durumu örneğimizi ele alalım. Fatura nesnesinin durum alanını güncellememiz gerektiğini varsayalım, ancak aynı zamanda kayıtların durumu, başarısız kayıt kimlikleri, başarı sayısı gibi bilgilere de ihtiyacımız var. DML İfadeleri kullanarak bu mümkün değildir, dolayısıyla Veritabanı yöntemlerini kullanmalıyız operasyonumuzun durumunu öğrenmek için.
Misal
Faturanın "Durum" alanını, "Beklemede" durumundaysa ve oluşturma tarihi bugünse güncelleyeceğiz.
Aşağıda verilen kod, Database.update yöntemi kullanılarak Fatura kayıtlarının güncellenmesine yardımcı olacaktır. Ayrıca, bu kodu çalıştırmadan önce bir Fatura kaydı oluşturun.
// Code to update the records using the Database methods
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
// fetch the invoice created today
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
for (APEX_Invoice__c objInvoice: invoiceList) {
if (objInvoice.APEX_Status__c == 'Pending') {
objInvoice.APEX_Status__c = 'Paid';
updatedInvoiceList.add(objInvoice); //Adding records to the list
}
}
Database.SaveResult[] srList = Database.update(updatedInvoiceList, false);
// Database method to update the records in List
// Iterate through each returned result by the method
for (Database.SaveResult sr : srList) {
if (sr.isSuccess()) {
// This condition will be executed for successful records and will fetch
// the ids of successful records
System.debug('Successfully updated Invoice. Invoice ID is : ' + sr.getId());
} else {
// This condition will be executed for failed records
for(Database.Error objErr : sr.getErrors()) {
System.debug('The following error has occurred.');
// Printing error message in Debug log
System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
System.debug('Invoice oject field which are affected by the error:'
+ objErr.getFields());
}
}
}
Bu eğiticide yalnızca Ekleme ve Güncelleme işlemlerine bakacağız. Diğer operasyonlar bu operasyonlara ve son bölümde yaptıklarımıza oldukça benziyor.
Her işletme veya uygulama, temel gereksinimlerden biri olarak arama işlevine sahiptir. Bunun için Salesforce.com, SOSL ve SOQL kullanan iki ana yaklaşım sunar. Bu bölümde SOSL yaklaşımını ayrıntılı olarak tartışalım.
SOSL
Metin dizesinin nesne ve alan boyunca aranması SOSL kullanılarak yapılacaktır. Bu Salesforce Nesne Arama Dilidir. Birden çok nesne arasında belirli bir dizgeyi arama yeteneğine sahiptir.
SOSL deyimleri bir sObject listesi olarak değerlendirilir; burada, her liste belirli bir sObject türü için arama sonuçlarını içerir. Sonuç listeleri her zaman SOSL sorgusunda belirtilen sırayla döndürülür.
SOSL Sorgu Örneği
Belirli bir dizeyi arayabilen bir program geliştirmemiz gereken bir iş vakasını düşünün. Fatura nesnesinin Müşteri Adı alanında 'ABC' dizesini aramamız gerektiğini varsayalım. Kod aşağıdaki gibidir -
Öncelikle, Fatura nesnesinde Müşteri adı ile 'ABC' olarak tek bir kayıt oluşturmalısınız, böylece arandığında geçerli sonuç alabilelim.
// Program To Search the given string in all Object
// List to hold the returned results of sObject generic type
List<list<SObject>> invoiceSearchList = new List<List<SObject>>();
// SOSL query which will search for 'ABC' string in Customer Name field of Invoice Object
invoiceSearchList = [FIND 'ABC*' IN ALL FIELDS RETURNING APEX_Invoice_c
(Id,APEX_Customer_r.Name)];
// Returned result will be printed
System.debug('Search Result '+invoiceSearchList);
// Now suppose, you would like to search string 'ABC' in two objects,
// that is Invoice and Account. Then for this query goes like this:
// Program To Search the given string in Invoice and Account object,
// you could specify more objects if you want, create an Account with Name as ABC.
// List to hold the returned results of sObject generic type
List<List<SObject>> invoiceAndSearchList = new List<List<SObject>>();
// SOSL query which will search for 'ABC' string in Invoice and in Account object's fields
invoiceAndSearchList = [FIND 'ABC*' IN ALL FIELDS RETURNING APEX_Invoice__c
(Id,APEX_Customer__r.Name), Account];
// Returned result will be printed
System.debug('Search Result '+invoiceAndSearchList);
// This list will hold the returned results for Invoice Object
APEX_Invoice__c [] searchedInvoice = ((List<APEX_Invoice_c>)invoiceAndSearchList[0]);
// This list will hold the returned results for Account Object
Account [] searchedAccount = ((List<Account>)invoiceAndSearchList[1]);
System.debug('Value of searchedInvoice'+searchedInvoice+'Value of searchedAccount'
+ searchedAccount);
SOQL
Bu neredeyse SOQL ile aynıdır. Bunu, bir seferde yalnızca bir nesneden nesne kayıtlarını almak için kullanabilirsiniz. Yuvalanmış sorgular yazabilir ve ayrıca şu anda sorguladığınız üst veya alt nesneden kayıtları getirebilirsiniz.
Bir sonraki bölümde SOQL'i inceleyeceğiz.
Bu, SFDC Veritabanı ile çalışmak üzere tasarlanmış Salesforce Nesne Sorgu Dilidir. Yalnızca tek bir sObject'te belirli bir kritere göre kayıt arayabilir.
SOSL gibi, birden çok nesnede arama yapamaz, ancak iç içe sorguları destekler.
SOQL Örneği
Devam eden Chemical Company örneğimizi düşünün. Diyelim ki, bugün oluşturulmuş ve müşteri adı 'test' olmayan kayıtların bir listesine ihtiyacımız var. Bu durumda, SOQL sorgusunu aşağıda verildiği gibi kullanmamız gerekecek -
// fetching the Records via SOQL
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
InvoiceList = [SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM
APEX_Invoice__c WHERE createdDate = today AND APEX_Customer__r.Name != 'Test'];
// SOQL query for given criteria
// Printing the fetched records
System.debug('We have total '+InvoiceList.size()+' Records in List');
for (APEX_Invoice__c objInvoice: InvoiceList) {
System.debug('Record Value is '+objInvoice);
// Printing the Record fetched
}
SOQL sorgusunu, aşağıda gösterildiği gibi Geliştirici konsolundaki Sorgu Düzenleyicisi aracılığıyla çalıştırabilirsiniz.
Developer Console'da aşağıda verilen sorguyu çalıştırın. Bugün oluşturulan Fatura kayıtlarını arayın.
SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c
WHERE createdDate = today
Değerlerine ihtiyacınız olan alanları seçmelisiniz, aksi takdirde çalışma zamanı hataları atabilir.
İlişki Alanlarını Geçiş
Bu, SFDC'deki en önemli kısımlardan biridir, çünkü birçok kez üst çocuk nesne ilişkisi boyunca geçiş yapmamız gerekir.
Ayrıca, Veritabanına iki ilişkili nesne kaydı eklemeniz gereken durumlar olabilir. Örneğin, Fatura nesnesinin Müşteri nesnesiyle ilişkisi vardır ve bu nedenle bir Müşterinin birçok faturası olabilir.
Diyelim ki, faturayı oluşturuyorsunuz ve ardından bu faturayı Müşteri ile ilişkilendirmeniz gerekiyor. Bu işlev için aşağıdaki kodu kullanabilirsiniz -
// Now create the invoice record and relate it with the Customer object
// Before executing this, please create a Customer Records with Name 'Customer
// Creation Test'
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
// Relating Invoice to customer via id field of Customer object
objInvoice.APEX_Customer__c = [SELECT id FROM APEX_Customer__c WHERE Name =
'Customer Creation Test' LIMIT 1].id;
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice; //Creating Invoice
System.debug('Newly Created Invoice'+objInvoice); //Newly created invoice
Bu kod snippet'ini Developer Console'da çalıştırın. Yürütüldükten sonra, Geliştirici konsolundan faturanın kimliğini kopyalayın ve ardından SFDC'de aşağıda gösterildiği gibi aynısını açın. Ana kaydın zaten aşağıda gösterildiği gibi Fatura kaydına atandığını görebilirsiniz.
Alt Kayıtlar Alınıyor
Şimdi, belirli müşteri kaydı ile ilgili tüm faturaların tek bir yerde olması gereken bir örneği ele alalım. Bunun için çocuk ilişkisinin adını bilmeniz gerekir. Alt öğe ilişkisi adını görmek için, alt nesnedeki alan ayrıntı sayfasına gidin ve "Çocuk İlişkisi" değerini kontrol edin. Örneğimizde, sonuna __r ile eklenen faturalardır.
Misal
Bu örnekte, verileri ayarlamamız, 'ABC Müşteri' kaydı olarak bir müşteri oluşturmamız ve ardından bu müşteriye 3 fatura eklememiz gerekecek.
Şimdi, Müşterinin 'ABC Müşterisinin' sahip olduğu faturaları alacağız. Aşağıdakiler aynı sorgu -
// Fetching Child Records using SOQL
List<apex_customer__c> ListCustomers = [SELECT Name, Id,
(SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];
// Query for fetching the Child records along with Parent
System.debug('ListCustomers '+ListCustomers); // Parent Record
List<apex_invoice__c> ListOfInvoices = ListCustomers[0].Invoices__r;
// By this notation, you could fetch the child records and save it in List
System.debug('ListOfInvoices values of Child '+ListOfInvoices);
// Child records
Kayıt değerlerini Debug günlüklerinde görebilirsiniz.
Ebeveyn Kaydı Getiriliyor
Diyelim ki, oluşturulma tarihi bugün olan Faturanın Müşteri Adını getirmeniz gerekiyor, ardından aşağıda verilen sorguyu aynı şekilde kullanabilirsiniz -
Misal
Alt nesneyle birlikte Ana kaydın değerini alın.
// Fetching Parent Record Field value using SOQL
List<apex_invoice__c> ListOfInvoicesWithCustomerName = new List<apex_invoice__c>();
ListOfInvoicesWithCustomerName = [SELECT Name, id, APEX_Customer__r.Name
FROM APEX_Invoice__c LIMIT 10];
// Fetching the Parent record's values
for (APEX_Invoice__c objInv: ListOfInvoicesWithCustomerName) {
System.debug('Invoice Customer Name is '+objInv.APEX_Customer__r.Name);
// Will print the values, all the Customer Records will be printed
}
Burada APEX_Customer__r.Name notasyonunu kullandık, burada APEX_Customer__r ebeveyn ilişki adıdır, burada Ana alanın sonuna __r eklemeniz gerekir ve ardından üst alan değerini getirebilirsiniz.
Toplama İşlevleri
SOQL, SQL'de olduğu gibi bir toplama işlevine sahiptir. Toplama işlevleri, verileri toplamamıza ve özetlememize izin verir. Şimdi işlevi ayrıntılı olarak anlayalım.
Diyelim ki, Müşteri 'ABC Müşterisinden' elde ettiğimiz ortalama gelirin ne olduğunu bilmek istediniz, o zaman ortalamayı almak için bu işlevi kullanabilirsiniz.
Misal
// Getting Average of all the invoices for a Perticular Customer
AggregateResult[] groupedResults = [SELECT
AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE
APEX_Customer__r.Name = 'ABC Customer'];
Object avgPaidAmount = groupedResults[0].get('averageAmount');
System.debug('Total Average Amount Received From Customer ABC is '+avgPaidAmount);
Hata ayıklama günlüklerindeki çıktıyı kontrol edin. Bir toplama işlevi içeren herhangi bir sorgunun sonuçlarını bir dizi halinde döndürdüğünü unutmayın.AggregateResultnesneler. AggregateResult salt okunur bir sObject'tir ve yalnızca sorgu sonuçları için kullanılır. Büyük veriler üzerine Rapor oluşturmamız gerektiğinde faydalıdır.
Veri özetini gerçekleştirmek için kullanabileceğiniz başka toplama işlevleri de vardır.
MIN() - Bu, minimum değeri bulmak için kullanılabilir
MAX() - Bu, maksimum değeri bulmak için kullanılabilir.
Apex Değişkenlerini Bağlama
İstenen sonuçları almak için SOQL sorgusunda Apex değişkenini kullanabilirsiniz. Apex değişkenlerine İki nokta üst üste (:) gösterimi ile başvurulabilir.
Misal
// Apex Variable Reference
String CustomerName = 'ABC Customer';
List<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c
WHERE Name = :CustomerName];
// Query Using Apex variable
System.debug('ListCustomer Name'+ListCustomer); // Customer Name
Apex güvenliği, güvenlik ayarlarını uygulama ve kod çalıştırma üzerinde paylaşım kurallarını uygulama sürecini ifade eder. Apex sınıfları, iki anahtar kelime ile kontrol edilebilen güvenlik ayarlarına sahiptir.
Veri Güvenliği ve Paylaşım Kuralları
Apex genellikle sistem bağlamında, yani mevcut kullanıcının izinlerinde çalışır. Alan düzeyinde güvenlik ve paylaşım kuralları, kod yürütme sırasında dikkate alınmaz. Yalnızca anonim blok kodu, kodu yürüten kullanıcının izniyle yürütülür.
Apex kodumuz, güvenlik ve paylaşım ayarları yoluyla gizlenen hassas verileri Kullanıcıya ifşa etmemelidir. Bu nedenle, Apex güvenliği ve paylaşım kuralını uygulamak çok önemlidir.
Anahtar Kelime Paylaşımı ile
Bu anahtar kelimeyi kullanırsanız, Apex kodu mevcut kullanıcının Paylaşım ayarlarını Apex koduna zorlayacaktır. Bu, Profil iznini değil, yalnızca veri düzeyi paylaşım ayarlarını zorunlu kılar.
Kullanıcımızın 5 kayda erişimi olduğu, ancak toplam kayıt sayısının 10 olduğu bir örneği ele alalım. Yani Apex sınıfı, "Paylaşımla" Anahtar Kelimesi ile ilan edildiğinde, sadece kullanıcının bulunduğu 5 kaydı döndürecektir. erişimi var.
Example
Öncelikle, Müşteri nesnesinde 5 kayıtlık 'Ad' ile 'ABC Müşterisi' olarak en az 10 kayıt oluşturduğunuzdan ve geri kalan 5 kaydı 'XYZ Müşterisi' olarak oluşturduğunuzdan emin olun. Ardından, 'ABC Müşterisini' tüm Kullanıcılarla paylaşacak bir paylaşım kuralı oluşturun. Ayrıca, OWD of Customer nesnesini Özel olarak ayarladığımızdan da emin olmamız gerekir.
Aşağıda verilen kodu Developer Console'daki Anonim bloğa yapıştırın.
// Class With Sharing
public with sharing class MyClassWithSharing {
// Query To fetch 10 records
List<apex_customer__c> CustomerList = [SELECT id, Name FROM APEX_Customer__c LIMIT 10];
public Integer executeQuery () {
System.debug('List will have only 5 records and the actual records are'
+ CustomerList.size()+' as user has access to'+CustomerList);
Integer ListSize = CustomerList.size();
return ListSize;
}
}
// Save the above class and then execute as below
// Execute class using the object of class
MyClassWithSharing obj = new MyClassWithSharing();
Integer ListSize = obj.executeQuery();
Anahtar Kelime Paylaşmadan
Adından da anlaşılacağı gibi, bu anahtar kelimeyle bildirilen sınıf Sistem modunda yürütülür, yani Kullanıcının kayda erişiminden bağımsız olarak, sorgu tüm kayıtları alır.
// Class Without Sharing
public without sharing class MyClassWithoutSharing {
List<apex_customer__c> CustomerList = [SELECT id, Name FROM APEX_Customer__c LIMIT 10];
// Query To fetch 10 records, this will return all the records
public Integer executeQuery () {
System.debug('List will have only 5 records and the actula records are'
+ CustomerList.size()+' as user has access to'+CustomerList);
Integer ListSize = CustomerList.size();
return ListSize;
}
}
// Output will be 10 records.
Apex Sınıfı için Güvenliği Ayarlama
Belirli bir profil için bir Apex sınıfını etkinleştirebilir veya devre dışı bırakabilirsiniz. Aynısı için adımlar aşağıda verilmiştir. Hangi profilin hangi sınıfa erişimi olması gerektiğini belirleyebilirsiniz.
Sınıf listesi sayfasından Apex sınıfı güvenliğini ayarlama
Step 1 - Kurulum'dan, Geliştir → Apex Sınıfları'nı tıklayın.
Step 2- Kısıtlamak istediğiniz sınıfın adını tıklayın. CustomerOperationClass'a tıkladık.
Step 3 - Güvenlik'e tıklayın.
Step 4 - Kullanılabilir Profiller listesinden etkinleştirmek istediğiniz profilleri seçin ve Ekle'ye tıklayın veya Etkin Profiller listesinden devre dışı bırakmak istediğiniz profilleri seçin ve Kaldır'a tıklayın.
Step 5 - Kaydet'e tıklayın.
Apex Güvenliğini İzin Setinden Ayarlama
Step 1 - Kurulum'dan Kullanıcıları Yönet → İzin Kümeleri'ni tıklayın.
Step 2 - Bir izin seti seçin.
Step 3 - Apex Class Access'e tıklayın.
Step 4 - Düzenle'ye tıklayın.
Step 5 - Available Apex Classes listesinden etkinleştirmek istediğiniz Apex sınıflarını seçin ve Add'e tıklayın veya Enabled Apex Classes listesinden devre dışı bırakmak istediğiniz Apex sınıflarını seçin ve kaldır'a tıklayın.
Step 6 - Kaydet düğmesini tıklayın.
Apex çağırma, Apex sınıfını çalıştırma sürecini ifade eder. Apex sınıfı yalnızca aşağıda listelenen yollardan biri aracılığıyla çağrıldığında yürütülebilir -
Tetikleyiciler ve Anonim blok
Belirtilen olaylar için tetiklenen bir tetikleyici
Eşzamansız Apeks
Bir Apex sınıfını belirli aralıklarla çalışacak şekilde planlama veya bir toplu iş çalıştırma
Web Hizmetleri sınıfı
Apex E-posta Hizmeti sınıfı
Metotlarınızı SOAP ve REST Web servisleri aracılığıyla açığa çıkarmaya izin veren Apex Web Servisleri
Visualforce Denetleyicileri
Gelen e-postayı işlemek için Apex E-posta Hizmeti
JavaScript Kullanarak Apex'i Çağırma
Apex'te uygulanan Web hizmeti yöntemlerini çağırmak için Ajax araç seti
Şimdi Apex'i çağırmanın birkaç yaygın yolunu anlayacağız.
Anonim Blok Yürütmekten
Apex sınıfını, aşağıda gösterildiği gibi Developer Console'da anonim olarak çalıştırarak çağırabilirsiniz -
Step 1 - Developer Console'u açın.
Step 2 - Hata Ayıkla'yı tıklayın.
Step 3- Anonim çalıştır penceresi aşağıda gösterildiği gibi açılacaktır. Şimdi, Yürüt düğmesine tıklayın -
Step 4 - Logs (Günlükler) bölmesinde göründüğünde Debug Log'u açın.
Tetikleyiciden
Trigger'dan bir Apex sınıfı da çağırabilirsiniz. Tetikleyiciler, belirli bir olay meydana geldiğinde çağrılır ve tetikleyiciler, yürütülürken Apex sınıfını çağırabilir.
Aşağıda, bir Tetikleyici çağrıldığında bir sınıfın nasıl yürütüldüğünü gösteren örnek kod yer almaktadır.
Misal
// Class which will gets called from trigger
public without sharing class MyClassWithSharingTrigger {
public static Integer executeQuery (List<apex_customer__c> CustomerList) {
// perform some logic and operations here
Integer ListSize = CustomerList.size();
return ListSize;
}
}
// Trigger Code
trigger Customer_After_Insert_Example on APEX_Customer__c (after insert) {
System.debug('Trigger is Called and it will call Apex Class');
MyClassWithSharingTrigger.executeQuery(Trigger.new); // Calling Apex class and
// method of an Apex class
}
// This example is for reference, no need to execute and will have detail look on
// triggers later chapters.
Visualforce Sayfa Denetleyici Kodundan
Apex sınıfı, Visualforce sayfasından da çağrılabilir. Denetleyiciyi veya denetleyici uzantısını belirtebiliriz ve belirtilen Apex sınıfı çağrılır.
Misal
VF Page Code
Apex Class Code (Controller Extension)
Apex tetikleyicileri, belirli bir olay meydana geldiğinde yürütülen saklı yordamlar gibidir. Kayıtta bir olay meydana gelmeden önce ve sonra bir tetikleyici yürütülür.
Sözdizimi
trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }
Tetikleyicinin Yürütülmesi
Tetikleyiciyi tetikleyebileceğimiz olaylar aşağıdadır -
- insert
- update
- delete
- merge
- upsert
- undelete
Tetikleyici Örnek 1
Müşterinin 'Müşteri Durumu' alanı Etkin değil'den Etkin olarak değiştiğinde bir Fatura Kaydı oluşturmamız gerektiğine dair bir iş gereksinimi aldığımızı varsayalım. Bunun için APEX_Customer__c nesnesinde aşağıdaki adımları izleyerek bir tetikleyici oluşturacağız -
Step 1 - Nesneye git
Step 2 - Müşteri'ye tıklayın
Step 3 - Tetikleyiciyle ilgili listedeki 'Yeni' düğmesine tıklayın ve aşağıda gösterildiği gibi tetikleme kodunu ekleyin.
// Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
List InvoiceList = new List();
for (APEX_Customer__c objCustomer: Trigger.new) {
if (objCustomer.APEX_Customer_Status__c == 'Active') {
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
// DML to insert the Invoice List in SFDC
insert InvoiceList;
}
Açıklama
Trigger.new- Bu, şu anda tetikleme bağlamında bulunan kayıtları, eklenmekte veya güncellenmekte olan bağlam değişkenidir. Bu durumda, bu değişken Müşteri nesnesinin güncellenmiş kayıtlarına sahiptir.
Bağlamda bulunan başka bağlam değişkenleri de vardır - trigger.old, trigger.newMap, trigger.OldMap.
Tetikleyici Örnek 2
Yukarıdaki tetikleyici, Müşteri kayıtlarında bir güncelleme işlemi olduğunda yürütülecektir. Diyelim ki, fatura kaydı yalnızca Müşteri Durumu Etkin Değil'den Etkin'e değiştiğinde ve her seferinde değil; bunun için başka bir bağlam değişkeni kullanabiliriztrigger.oldMap bu, anahtarı kayıt kimliği ve değeri eski kayıt değerleri olarak saklayacaktır.
// Modified Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
for (APEX_Customer__c objCustomer: Trigger.new) {
// condition to check the old value and new value
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
// DML to insert the Invoice List in SFDC
insert InvoiceList;
}
Açıklama
Daha önce açıklandığı gibi, güncellenen kayıtların Id ve eski değerini saklayan bir bağlam değişkeni olan Trigger.oldMap değişkenini kullandık.
Tasarım kalıpları, kodumuzu daha verimli hale getirmek ve vali sınırlarına ulaşmamak için kullanılır. Genellikle geliştiriciler, nesnelerin tekrar tekrar somutlaştırılmasına neden olabilecek verimsiz kod yazabilirler. Bu, verimsiz, kötü performans gösteren kodlara ve potansiyel olarak vali sınırlarının ihlaline neden olabilir. Bu, bir dizi kayıt üzerinde çalışabildikleri için en yaygın olarak tetikleyicilerde görülür.
Bu bölümde bazı önemli tasarım modeli stratejilerini göreceğiz.
Toplu Tetikleyici Tasarım Desenleri
Gerçek iş durumunda, tek seferde binlerce kaydı işlemeniz gerekebilir. Tetikleyiciniz bu tür durumları ele almak için tasarlanmamışsa, kayıtları işlerken başarısız olabilir. Tetikleyicileri uygularken izlemeniz gereken bazı en iyi uygulamalar vardır. Tüm tetikleyiciler, varsayılan olarak toplu tetikleyicilerdir ve aynı anda birden çok kaydı işleyebilir. Her zaman aynı anda birden fazla kaydı işlemeyi planlamalısınız.
Bir iş vakası düşünün, burada çok sayıda kayıt işlemeniz gerekir ve tetiği aşağıda verildiği gibi yazdınız. Bu, Müşteri Durumu Etkin Değil'den Etkin'e değiştiğinde fatura kaydını eklemek için aldığımız örnekle aynıdır.
// Bad Trigger Example
trigger Customer_After_Insert on APEX_Customer__c (after update) {
for (APEX_Customer__c objCustomer: Trigger.new) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice; //DML to insert the Invoice List in SFDC
}
}
}
Artık DML İfadesinin yalnızca birkaç kaydı işlerken çalışacak olan döngü bloğu için yazıldığını ancak yüzlerce kaydı işlerken, işlem başına DML İfadesi sınırına ulaşacağını görebilirsiniz. governor limit. Sonraki bölümde Vali Limitlerine ayrıntılı bir göz atacağız.
Bundan kaçınmak için, bir seferde birden çok kaydı işlemek için tetikleyiciyi verimli hale getirmeliyiz.
Aşağıdaki örnek, aynı şeyi anlamanıza yardımcı olacaktır -
// Modified Trigger Code-Bulk Trigger
trigger Customer_After_Insert on APEX_Customer__c (after update) {
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
for (APEX_Customer__c objCustomer: Trigger.new) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
//condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);//Adding records to List
}
}
insert InvoiceList;
// DML to insert the Invoice List in SFDC, this list contains the all records
// which need to be modified and will fire only one DML
}
Bu tetikleyici, bir Liste üzerinde çalışacağından ve Listede değiştirilmesi gereken tüm kayıtlar bulunduğundan yalnızca 1 DML ifadesini tetikler.
Bu şekilde, DML deyimi düzenleyici sınırlarından kurtulabilirsiniz.
Tetik Yardımcı Sınıfı
Tüm kodu tetikte yazmak da iyi bir uygulama değildir. Bu nedenle, Apex sınıfını çağırmalı ve işlemi aşağıda gösterildiği gibi Trigger'dan Apex sınıfına devretmelisiniz. Trigger Helper sınıfı, tetikleyici için tüm işlemleri yapan sınıftır.
Fatura kaydı oluşturma örneğimizi tekrar ele alalım.
// Below is the Trigger without Helper class
trigger Customer_After_Insert on APEX_Customer__c (after update) {
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
for (APEX_Customer__c objCustomer: Trigger.new) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
// Below is the trigger with helper class
// Trigger with Helper Class
trigger Customer_After_Insert on APEX_Customer__c (after update) {
CustomerTriggerHelper.createInvoiceRecords(Trigger.new, trigger.oldMap);
// Trigger calls the helper class and does not have any code in Trigger
}
Yardımcı Sınıf
public class CustomerTriggerHelper {
public static void createInvoiceRecords (List<apex_customer__c>
customerList, Map<id, apex_customer__c> oldMapCustomer) {
List<apex_invoice__c> InvoiceList = new Listvapex_invoice__c>();
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
oldMapCustomer.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
// objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
}
Bunda, tüm işlemler yardımcı sınıfa devredilmiştir ve yeni bir işlevselliğe ihtiyaç duyduğumuzda, tetikleyiciyi değiştirmeden kodu yardımcı sınıfa ekleyebiliriz.
Her Nesnede Tek Tetik
Her nesne için daima tek bir tetikleyici oluşturun. Aynı nesne üzerindeki birden çok tetikleyici, vali sınırlarına ulaşırsa çatışmaya ve hatalara neden olabilir.
Gereksinime göre yardımcı sınıftan farklı yöntemleri çağırmak için bağlam değişkenini kullanabilirsiniz. Önceki örneğimizi düşünün. CreateInvoice yöntemimizin yalnızca kayıt güncellendiğinde ve birden çok olayda çağrılması gerektiğini varsayalım. O zaman yürütmeyi aşağıdaki gibi kontrol edebiliriz -
// Trigger with Context variable for controlling the calling flow
trigger Customer_After_Insert on APEX_Customer__c (after update, after insert) {
if (trigger.isAfter && trigger.isUpdate) {
// This condition will check for trigger events using isAfter and isUpdate
// context variable
CustomerTriggerHelper.createInvoiceRecords(Trigger.new);
// Trigger calls the helper class and does not have any code in Trigger
// and this will be called only when trigger ids after update
}
}
// Helper Class
public class CustomerTriggerHelper {
//Method To Create Invoice Records
public static void createInvoiceRecords (List<apex_customer__c> customerList) {
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
}
Vali yürütme sınırları, Force.com çok kiracılı platformundaki kaynakların verimli kullanılmasını sağlar. Verimli işleme için Salesforce.com tarafından kod çalıştırmada belirtilen sınırdır.
Vali Limitleri nelerdir?
Bildiğimiz gibi Apex çok kiracılı bir ortamda çalışıyor, yani tek bir kaynak tüm müşteriler ve kuruluşlar tarafından paylaşılıyor. Bu nedenle, hiç kimsenin kaynakları tekeline almadığından ve bu nedenle Salesforce.com'un kod yürütmeyi yöneten ve sınırlayan bir dizi sınır oluşturduğundan emin olmak gerekir. Düzenleyici sınırlarından herhangi biri aşıldığında, hata verir ve programın yürütülmesini durdurur.
Bir Geliştiricinin bakış açısından, kodumuzun ölçeklenebilir olması ve sınırları aşmaması gerektiğinden emin olmak önemlidir.
Tüm bu limitler işlem bazında uygulanır. Tek bir tetikleme yürütme, bir işlemdir.
Gördüğümüz gibi, tetik tasarım modeli limit hatasını önlemeye yardımcı olur. Şimdi diğer önemli sınırları göreceğiz.
SOQL Sorgu Sınırını Önleme
İşlem başına yalnızca 100 sorgu yayınlayabilirsiniz, yani kodunuz 100'den fazla SOQL sorgusu yayınladığında hata verir.
Misal
Bu örnek, SOQL sorgu sınırına nasıl ulaşılabileceğini gösterir -
Aşağıdaki tetikleyici, bir müşteri listesi üzerinde yinelenir ve alt kaydın (Fatura) açıklamasını 'Ödeme Tamam' dizesiyle günceller.
// Helper class:Below code needs o be checked.
public class CustomerTriggerHelper {
public static void isAfterUpdateCall(Trigger.new) {
createInvoiceRecords(trigger.new);//Method call
updateCustomerDescription(trigger.new);
}
// Method To Create Invoice Records
public static void createInvoiceRecords (List<apex_customer__c> customerList) {
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
// Method to update the invoice records
public static updateCustomerDescription (List<apex_customer__c> customerList) {
for (APEX_Customer__c objCust: customerList) {
List<apex_customer__c> invList = [SELECT Id, Name,
APEX_Description__c FROM APEX_Invoice__c WHERE APEX_Customer__c = :objCust.id];
// This query will fire for the number of records customer list has and will
// hit the governor limit when records are more than 100
for (APEX_Invoice__c objInv: invList) {
objInv.APEX_Description__c = 'OK To Pay';
update objInv;
// Update invoice, this will also hit the governor limit for DML if large
// number(150) of records are there
}
}
}
}
'UpdateCustomerDescription' yöntemi çağrıldığında ve müşteri kayıtlarının sayısı 100'den fazla olduğunda, SOQL sınırına ulaşacaktır. Bundan kaçınmak için, SOQL sorgusunu asla For Loop'a yazmayın. Bu durumda, SOQL sorgusu For döngüsüne yazılmıştır.
Aşağıda, DML'den ve SOQL sınırından nasıl kaçınılacağını gösteren bir örnek verilmiştir. Fatura kayıtlarını almak için iç içe geçmiş ilişki sorgusunu kullandık ve bağlam değişkenini kullandıktrigger.newMap Kimlik haritasını ve Müşteri kayıtlarını almak için.
// SOQL-Good Way to Write Query and avoid limit exception
// Helper Class
public class CustomerTriggerHelper {
public static void isAfterUpdateCall(Trigger.new) {
createInvoiceRecords(trigger.new); //Method call
updateCustomerDescription(trigger.new, trigger.newMap);
}
// Method To Create Invoice Records
public static void createInvoiceRecords (List<apex_customer__c> customerList) {
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
// Method to update the invoice records
public static updateCustomerDescription (List<apex_customer__c>
customerList, Map<id, apex_customer__c> newMapVariable) {
List<apex_customer__c> customerListWithInvoice = [SELECT id,
Name,(SELECT Id, Name, APEX_Description__c FROM APEX_Invoice__r) FROM
APEX_Customer__c WHERE Id IN :newMapVariable.keySet()];
// Query will be for only one time and fetches all the records
List<apex_invoice__c> invoiceToUpdate = new
List<apex_invoice__c>();
for (APEX_Customer__c objCust: customerList) {
for (APEX_Invoice__c objInv: invList) {
objInv.APEX_Description__c = 'OK To Pay';
invoiceToUpdate.add(objInv);
// Add the modified records to List
}
}
update invoiceToUpdate;
}
}
DML Toplu Aramalar
Bu örnek, Toplu tetikleyiciyi tetikleyici yardımcı sınıf modeliyle birlikte gösterir. Önce yardımcı sınıfı ve ardından tetikleyiciyi kaydetmelisiniz.
Note - Aşağıdaki kodu daha önce oluşturduğumuz 'CustomerTriggerHelper' sınıfına yapıştırın.
// Helper Class
public class CustomerTriggerHelper {
public static void isAfterUpdateCall(List<apex_customer__c> customerList,
Map<id, apex_customer__c> mapIdToCustomers, Map<id, apex_customer__c>
mapOldItToCustomers) {
createInvoiceRecords(customerList, mapOldItToCustomers); //Method call
updateCustomerDescription(customerList,mapIdToCustomers,
mapOldItToCustomers);
}
// Method To Create Invoice Records
public static void createInvoiceRecords (List<apex_customer__c>
customerList, Map<id, apex_customer__c> mapOldItToCustomers) {
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
List<apex_customer__c> customerToInvoice = [SELECT id, Name FROM
APEX_Customer__c LIMIT 1];
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
mapOldItToCustomers.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
//condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
objInvoice.APEX_Customer__c = objCustomer.id;
InvoiceList.add(objInvoice);
}
}
system.debug('InvoiceList&&&'+InvoiceList);
insert InvoiceList;
// DML to insert the Invoice List in SFDC. This also follows the Bulk pattern
}
// Method to update the invoice records
public static void updateCustomerDescription (List<apex_customer__c>
customerList, Map<id, apex_customer__c> newMapVariable, Map<id,
apex_customer__c> oldCustomerMap) {
List<apex_customer__c> customerListWithInvoice = [SELECT id,
Name,(SELECT Id, Name, APEX_Description__c FROM Invoices__r) FROM
APEX_Customer__c WHERE Id IN :newMapVariable.keySet()];
// Query will be for only one time and fetches all the records
List<apex_invoice__c> invoiceToUpdate = new List<apex_invoice__c>();
List<apex_invoice__c> invoiceFetched = new List<apex_invoice__c>();
invoiceFetched = customerListWithInvoice[0].Invoices__r;
system.debug('invoiceFetched'+invoiceFetched);
system.debug('customerListWithInvoice****'+customerListWithInvoice);
for (APEX_Customer__c objCust: customerList) {
system.debug('objCust.Invoices__r'+objCust.Invoices__r);
if (objCust.APEX_Active__c == true &&
oldCustomerMap.get(objCust.id).APEX_Active__c == false) {
for (APEX_Invoice__c objInv: invoiceFetched) {
system.debug('I am in For Loop'+objInv);
objInv.APEX_Description__c = 'OK To Pay';
invoiceToUpdate.add(objInv);
// Add the modified records to List
}
}
}
system.debug('Value of List ***'+invoiceToUpdate);
update invoiceToUpdate;
// This statement is Bulk DML which performs the DML on List and avoids
// the DML Governor limit
}
}
// Trigger Code for this class: Paste this code in 'Customer_After_Insert'
// trigger on Customer Object
trigger Customer_After_Insert on APEX_Customer__c (after update) {
CustomerTriggerHelper.isAfterUpdateCall(Trigger.new, trigger.newMap,
trigger.oldMap);
// Trigger calls the helper class and does not have any code in Trigger
}
Diğer Salesforce Governor Limitleri
Aşağıdaki tablo önemli düzenleyici limitlerini listelemektedir.
Açıklama | Sınırı |
---|---|
Toplam yığın boyutu | 6 MB / 12 MB |
Yayınlanan toplam DML beyanı sayısı | 150 |
Tek bir SOSL sorgusu tarafından alınan toplam kayıt sayısı | 2000 |
Yayınlanan toplam SOSL sorgusu sayısı | 20 |
Database.getQueryLocator tarafından alınan toplam kayıt sayısı | 10000 |
SOQL sorguları tarafından alınan toplam kayıt sayısı | 50000 |
Bu bölümde, Apex'te Toplu İşlemeyi anlayacağız. Günlük olarak çok sayıda kaydı işleyeceğimiz, muhtemelen verilerin temizlenmesi veya belki de kullanılmayan bazı verilerin silineceği bir senaryo düşünün.
Batch Apex nedir?
Batch Apex, çok sayıda kaydı işlemek için özel olarak tasarlanmış ve düzenleyici sınırlarında senkronize koddan daha fazla esnekliğe sahip olan Apex kodunun eşzamansız yürütülmesidir.
Batch Apex ne zaman kullanılır?
Çok sayıda kaydı günlük olarak veya hatta belirli bir aralıkta işlemek istediğinizde, Toplu İş Apeksine gidebilirsiniz.
Ayrıca, bir işlemin zaman uyumsuz olmasını istediğinizde Batch Apex'i uygulayabilirsiniz. Batch Apex, geliştirici tarafından uygulanması gereken bir arayüz olarak sunulur. Toplu işler, Apex kullanılarak çalışma zamanında programlı olarak çağrılabilir. Batch Apex, tüm kayıt kümenizi kapsayan ve işlemeyi yönetilebilir veri yığınlarına bölerek küçük kayıt yığınları üzerinde çalışır.
Toplu Apex Kullanımı
Batch Apex'i kullandığımızda, Salesforce tarafından sağlanan Database.Batchable arabirimini uygulamalı ve ardından programı programlı olarak çağırmalıyız.
Aşağıdaki adımları izleyerek sınıfı izleyebilirsiniz -
Toplu Apex Batch işinin yürütülmesini izlemek veya durdurmak için Kurulum → İzleme → Apex İşleri veya İşler → Apex İşleri'ne gidin.
Database.Batchable arabirimi, uygulanması gereken aşağıdaki üç yönteme sahiptir:
- Start
- Execute
- Finish
Şimdi her yöntemi ayrıntılı olarak anlayalım.
Başlat
Başlangıç yöntemi, Database.Batchable arabiriminin üç yönteminden biridir.
Syntax
global void execute(Database.BatchableContext BC, list<sobject<) {}
Bu yöntem, Toplu İşin başlangıcında çağrılır ve Toplu İşin üzerinde çalışacağı verileri toplar.
Yöntemi anlamak için aşağıdaki noktaları göz önünde bulundurun -
Kullan Database.QueryLocatortoplu işte kullanılan nesnelerin kapsamını oluşturmak için basit bir sorgu kullandığınızda nesne. Bu durumda, SOQL veri satırı sınırı atlanacaktır.
Kayıtları işlemek için karmaşık kriterleriniz olduğunda yinelenebilir nesneyi kullanın. Database.QueryLocator, işlenmesi gereken kayıtların kapsamını belirler.
Yürüt
Şimdi Database.Batchable arayüzünün Execute yöntemini anlayalım.
Syntax
global void execute(Database.BatchableContext BC, list<sobject<) {}
burada, liste <sObject <Database.QueryLocator yöntemi tarafından döndürülür.
Bu yöntem, Başlat yönteminden sonra çağrılır ve Toplu İş için gerekli tüm işlemleri yapar.
Bitiş
Şimdi Database.Batchable arayüzünün Finish yöntemini tartışacağız.
Syntax
global void finish(Database.BatchableContext BC) {}
Bu yöntem sonunda çağrılır ve işlenen toplu iş kayıtları ve durum hakkında bilgiler içeren bir e-posta göndermek gibi bazı sonlandırma etkinlikleri yapabilirsiniz.
Batch Apex Örneği
Mevcut Kimyasal Şirketimizin bir örneğini ele alalım ve bugün olduğu gibi Etkin olarak işaretlenmiş ve Tarihi oluşturan Müşteri Kayıtlarının Müşteri Durumu ve Müşteri Tanımı alanını güncelleme zorunluluğumuz olduğunu varsayalım. Bu günlük olarak yapılmalı ve Toplu İşlemin durumu hakkında bir Kullanıcıya bir e-posta gönderilmelidir. Müşteri Durumunu 'İşlendi' ve Müşteri Açıklamasını 'Toplu İş Yoluyla Güncellendi' olarak güncelleyin.
// Batch Job for Processing the Records
global class CustomerProessingBatch implements Database.Batchable<sobject> {
global String [] email = new String[] {'[email protected]'};
// Add here your email address here
// Start Method
global Database.Querylocator start (Database.BatchableContext BC) {
return Database.getQueryLocator('Select id, Name, APEX_Customer_Status__c,
APEX_Customer_Decscription__c From APEX_Customer__c WHERE createdDate = today
AND APEX_Active__c = true');
// Query which will be determine the scope of Records fetching the same
}
// Execute method
global void execute (Database.BatchableContext BC, List<sobject> scope) {
List<apex_customer__c> customerList = new List<apex_customer__c>();
List<apex_customer__c> updtaedCustomerList = new List<apex_customer__c>();
// List to hold updated customer
for (sObject objScope: scope) {
APEX_Customer__c newObjScope = (APEX_Customer__c)objScope ;
// type casting from generic sOject to APEX_Customer__c
newObjScope.APEX_Customer_Decscription__c = 'Updated Via Batch Job';
newObjScope.APEX_Customer_Status__c = 'Processed';
updtaedCustomerList.add(newObjScope); // Add records to the List
System.debug('Value of UpdatedCustomerList '+updtaedCustomerList);
}
if (updtaedCustomerList != null && updtaedCustomerList.size()>0) {
// Check if List is empty or not
Database.update(updtaedCustomerList); System.debug('List Size '
+ updtaedCustomerList.size());
// Update the Records
}
}
// Finish Method
global void finish(Database.BatchableContext BC) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
// Below code will fetch the job Id
AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors,
a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById,
a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];
// get the job Id
System.debug('$$$ Jobid is'+BC.getJobId());
// below code will send an email to User about the status
mail.setToAddresses(email);
mail.setReplyTo('[email protected]'); // Add here your email address
mail.setSenderDisplayName('Apex Batch Processing Module');
mail.setSubject('Batch Processing '+a.Status);
mail.setPlainTextBody('The Batch Apex job processed'
+ a.TotalJobItems+'batches with '+a.NumberOfErrors+'failures'+'Job Item
processed are'+a.JobItemsProcessed);
Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail});
}
}
Bu kodu yürütmek için, önce kodu kaydedin ve ardından aşağıdaki kodu Anonim çalıştır'a yapıştırın. Bu, sınıfın nesnesini yaratacak ve Database.execute yöntemi Batch işini yürütecektir. İş tamamlandığında, belirtilen e-posta adresine bir e-posta gönderilecektir. Bir müşteri kaydınızın olduğundan emin olun.Active kontrol edildiği gibi.
// Paste in Developer Console
CustomerProessingBatch objClass = new CustomerProessingBatch();
Database.executeBatch (objClass);
Bu ders yürütüldüğünde, e-postayı bilgi içeren e-postayı alacağınız yerde verdiğiniz e-posta adresini kontrol edin. Ayrıca, toplu işin durumunu İzleme sayfası ve yukarıda verilen adımlar aracılığıyla kontrol edebilirsiniz.
Hata ayıklama günlüklerini kontrol ederseniz, kaç kaydın işlendiğini gösteren Liste boyutunu bulabilirsiniz.
Limitations
Bir seferde yalnızca 5 toplu iş işlememiz olabilir. Bu, Batch Apex'in sınırlamalarından biridir.
Apex Ayrıntı Sayfasını Kullanarak Apex Toplu İşini Planlama
Apex sınıfını aşağıda verilen Apex ayrıntı sayfası aracılığıyla planlayabilirsiniz -
Step 1 - Kurulum ⇒ Apex Classes'a gidin, Apex Classes'a tıklayın.
Step 2 - Apex'i Planla düğmesine tıklayın.
Step 3 - Ayrıntıları sağlayın.
Apex Batch Job'u Planlanabilir Arayüzü Kullanarak Planlama
Apex Batch Job'u, aşağıda verilen Planlanabilir Arayüzü kullanarak planlayabilirsiniz -
// Batch Job for Processing the Records
global class CustomerProessingBatch implements Database.Batchable<sobject> {
global String [] email = new String[] {'[email protected]'};
// Add here your email address here
// Start Method
global Database.Querylocator start (Database.BatchableContext BC) {
return Database.getQueryLocator('Select id, Name, APEX_Customer_Status__c,
APEX_Customer_Decscription__c From APEX_Customer__c WHERE createdDate = today
AND APEX_Active__c = true');
// Query which will be determine the scope of Records fetching the same
}
// Execute method
global void execute (Database.BatchableContext BC, List<sobject> scope) {
List<apex_customer__c> customerList = new List<apex_customer__c>();
List<apex_customer__c> updtaedCustomerList = new
List<apex_customer__c>();//List to hold updated customer
for (sObject objScope: scope) {
APEX_Customer__c newObjScope = (APEX_Customer__c)objScope ;//type
casting from generic sOject to APEX_Customer__c
newObjScope.APEX_Customer_Decscription__c = 'Updated Via Batch Job';
newObjScope.APEX_Customer_Status__c = 'Processed';
updtaedCustomerList.add(newObjScope);//Add records to the List
System.debug('Value of UpdatedCustomerList '+updtaedCustomerList);
}
if (updtaedCustomerList != null && updtaedCustomerList.size()>0) {
// Check if List is empty or not
Database.update(updtaedCustomerList); System.debug('List Size'
+ updtaedCustomerList.size());
// Update the Records
}
}
// Finish Method
global void finish(Database.BatchableContext BC) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
// Below code will fetch the job Id
AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors,
a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById,
a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];//get the job Id
System.debug('$$$ Jobid is'+BC.getJobId());
// below code will send an email to User about the status
mail.setToAddresses(email);
mail.setReplyTo('[email protected]');//Add here your email address
mail.setSenderDisplayName('Apex Batch Processing Module');
mail.setSubject('Batch Processing '+a.Status);
mail.setPlainTextBody('The Batch Apex job processed'
+ a.TotalJobItems+'batches with '+a.NumberOfErrors+'failures'+'Job Item
processed are'+a.JobItemsProcessed);
Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail});
}
// Scheduler Method to scedule the class
global void execute(SchedulableContext sc) {
CustomerProessingBatch conInstance = new CustomerProessingBatch();
database.executebatch(conInstance,100);
}
}
// Paste in Developer Console
CustomerProessingBatch objClass = new CustomerProcessingBatch();
Database.executeBatch (objClass);
Hata ayıklama, herhangi bir programlama geliştirmenin önemli bir parçasıdır. Apex'te, hata ayıklama için kullanılabilecek belirli araçlarımız var. Bunlardan biri, hata ayıklama günlüklerindeki değişkenin değerini ve çıktısını yazdıran system.debug () yöntemidir.
Hata ayıklama için aşağıdaki iki aracı kullanabiliriz -
- Geliştirici Konsolu
- Hata Ayıklama Günlükleri
Developer Console aracılığıyla hata ayıklama
Geliştirici konsolunu kullanabilir ve aşağıdaki gibi Apex'te hata ayıklamak için anonim işlevselliği çalıştırabilirsiniz -
Example
Bugün yaratılan müşteri kayıtlarını getirmeye ilişkin mevcut örneğimizi düşünün. Sadece sorgunun sonuçları döndürüp döndürmediğini bilmek istiyoruz ve eğer evet ise, o zaman List'in değerini kontrol edeceğiz.
Anonim pencereyi çalıştır penceresine aşağıda verilen kodu yapıştırın ve anonim çalıştır penceresini açmak için yaptığımız adımları izleyin.
Step 1 - Geliştirici konsolunu açın
Step 2 - Aşağıda gösterildiği gibi 'Hata Ayıklama'dan Anonim Yürüt'ü açın.
Step 3 - Anonim Yürüt penceresini açın ve aşağıdaki kodu yapıştırın ve çalıştır'a tıklayın.
// Debugging The Apex
List<apex_customer__c> customerList = new List<apex_customer__c>();
customerList = [SELECT Id, Name FROM APEX_Customer__c WHERE CreatedDate =
today];
// Our Query
System.debug('Records on List are '+customerList+' And Records are '+customerList);
// Debug statement to check the value of List and Size
Step 4 - Günlükleri aşağıda gösterildiği gibi açın.
Step 5 - Aşağıda gösterildiği gibi filtre durumuna 'KULLANICI' girin.
Step 6 - Aşağıda gösterildiği gibi KULLANICI HATA AYIKLAMA İfadesini açın.
Hata Ayıklama Günlükleri aracılığıyla hata ayıklama
Aynı sınıfta hata ayıklama günlükleri aracılığıyla da hata ayıklayabilirsiniz. Diyelim ki, Müşteri nesnesinde bir tetikleyiciniz var ve bazı değişken değerler için hata ayıklaması gerekiyor, ardından bunu aşağıda gösterildiği gibi hata ayıklama günlükleri aracılığıyla yapabilirsiniz -
Bu, değiştirilen müşteri etkinse ve şu anda kapsamda bulunan değişkenlerin ve kayıtların değerlerini kontrol etmek istiyorsanız Açıklama alanını güncelleyen Tetikleyici Kodudur -
trigger CustomerTrigger on APEX_Customer__c (before update) {
List<apex_customer__c> customerList = new List<apex_customer__c>();
for (APEX_Customer__c objCust: Trigger.new) {
System.debug('objCust current value is'+objCust);
if (objCust.APEX_Active__c == true) {
objCust.APEX_Customer_Description__c = 'updated';
System.debug('The record which has satisfied the condition '+objCust);
}
}
}
Hata Ayıklama günlüklerini oluşturmak için aşağıda verilen adımları izleyin.
Step 1- Kullanıcınız için Hata Ayıklama günlüklerini ayarlayın. Kurulum'a gidin ve arama kurulumu penceresinde 'Hata Ayıklama Günlüğü' yazın ve ardından Bağlantı'ya tıklayın.
Step 2 - Hata ayıklama günlüklerini aşağıdaki gibi ayarlayın.
Step 3- Kurulum gerektiren Kullanıcı adını girin. İsminizi buraya girin.
Step 4 - Müşteri kayıtlarını, hata ayıklama günlüğünü oluşturmak için olayın gerçekleşmesi gerektiği şekilde değiştirin.
Step 5- Şimdi hata ayıklama günlükleri bölümüne tekrar gidin. Hata ayıklama günlüklerini açın ve Sıfırla'ya tıklayın.
Step 6 - İlk hata ayıklama günlüğünün görünüm bağlantısını tıklayın.
Step 7 - Aşağıda gösterildiği gibi tarayıcı aramasını kullanarak 'USER' dizesini arayın.
Hata ayıklama ifadesi, noktayı belirlediğimiz alanın değerini gösterecektir.
Test, Apex'in veya başka herhangi bir uygulama geliştirmenin entegre bir parçasıdır. Apex'te, tüm birim testleri için geliştirilecek ayrı test sınıflarımız var.
Test Sınıfları
SFDC'de, Kodun Üretime dağıtılabilmesi için% 75 kod kapsamına sahip olması gerekir. Bu kod kapsamı, test sınıfları tarafından gerçekleştirilir. Test sınıfları, diğer Apex sınıfının işlevselliğini test eden kod parçacıklarıdır.
Daha önce yazdığımız kodlarımızdan biri için bir test sınıfı yazalım. Tetikleyici ve Yardımcı sınıf kodumuzu kapsayacak şekilde test sınıfı yazacağız. Aşağıda kapsanması gereken tetikleyici ve yardımcı sınıf bulunmaktadır.
// Trigger with Helper Class
trigger Customer_After_Insert on APEX_Customer__c (after update) {
CustomerTriggerHelper.createInvoiceRecords(Trigger.new, trigger.oldMap);
//Trigger calls the helper class and does not have any code in Trigger
}
// Helper Class:
public class CustomerTriggerHelper {
public static void createInvoiceRecords (List<apex_customer__c>
customerList, Map<id, apex_customer__c> oldMapCustomer) {
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
for (APEX_Customer__c objCustomer: customerList) {
if (objCustomer.APEX_Customer_Status__c == 'Active' &&
oldMapCustomer.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
// condition to check the old value and new value
APEX_Invoice__c objInvoice = new APEX_Invoice__c();
objInvoice.APEX_Status__c = 'Pending';
objInvoice.APEX_Customer__c = objCustomer.id;
InvoiceList.add(objInvoice);
}
}
insert InvoiceList; // DML to insert the Invoice List in SFDC
}
}
Test Sınıfı Oluşturma
Bu bölümde, bir Test Sınıfının nasıl oluşturulacağını anlayacağız.
Veri Oluşturma
Test sınıfımızın kendisinde test sınıfı için veri oluşturmamız gerekiyor. Test sınıfının varsayılan olarak kuruluş verilerine erişimi yoktur, ancak @isTest'i ayarlarsanız (seeAllData = true), kuruluşun verilerine de erişebilir.
@isTest ek açıklaması
Bu ek açıklamayı kullanarak, bunun bir test sınıfı olduğunu ve kuruluşun toplam kod sınırına dahil edilmeyeceğini beyan ettiniz.
testMethod anahtar sözcüğü
Birim test yöntemleri, bağımsız değişken almayan, veritabanına veri göndermeyen, e-posta göndermeyen ve yöntem tanımında testMethod anahtar sözcüğü veya isTest ek açıklamasıyla bildirilen yöntemlerdir. Ayrıca test yöntemleri, test sınıflarında, yani isTest ile açıklanmış sınıflarda tanımlanmalıdır.
Örneklerimizde 'myUnitTest' test yöntemini kullandık.
Test.startTest () ve Test.stopTest ()
Bunlar, test sınıfları için mevcut olan standart test yöntemleridir. Bu yöntemler, testimizi simüle edeceğimiz olay veya eylemi içerir. Bu örnekte olduğu gibi, blok başlatmak ve durdurmak için yaptığımız gibi kayıtları güncelleyerek yangın tetikleyicisini simüle etmek için tetikleyici ve yardımcı sınıfımızı test edeceğiz. Bu aynı zamanda başlatma ve durdurma bloğunda bulunan koda ayrı düzenleyici sınırı sağlar.
System.assert ()
Bu yöntem, istenen çıktıyı gerçek ile kontrol eder. Bu durumda, bir Fatura kaydının eklenmesini bekliyoruz, bu yüzden aynısını kontrol etmek için assert ekledik.
Example
/**
* This class contains unit tests for validating the behavior of Apex classes
* and triggers.
*
* Unit tests are class methods that verify whether a particular piece
* of code is working properly. Unit test methods take no arguments,
* commit no data to the database, and are flagged with the testMethod
* keyword in the method definition.
*
* All test methods in an organization are executed whenever Apex code is deployed
* to a production organization to confirm correctness, ensure code
* coverage, and prevent regressions. All Apex classes are
* required to have at least 75% code coverage in order to be deployed
* to a production organization. In addition, all triggers must have some code coverage.
*
* The @isTest class annotation indicates this class only contains test
* methods. Classes defined with the @isTest annotation do not count against
* the organization size limit for all Apex scripts.
*
* See the Apex Language Reference for more information about Testing and Code Coverage.
*/
@isTest
private class CustomerTriggerTestClass {
static testMethod void myUnitTest() {
//Create Data for Customer Objet
APEX_Customer__c objCust = new APEX_Customer__c();
objCust.Name = 'Test Customer';
objCust.APEX_Customer_Status__c = 'Inactive';
insert objCust;
// Now, our trigger will fire on After update event so update the Records
Test.startTest(); // Starts the scope of test
objCust.APEX_Customer_Status__c = 'Active';
update objCust;
Test.stopTest(); // Ends the scope of test
// Now check if it is giving desired results using system.assert
// Statement.New invoice should be created
List<apex_invoice__c> invList = [SELECT Id, APEX_Customer__c FROM
APEX_Invoice__c WHERE APEX_Customer__c = :objCust.id];
system.assertEquals(1,invList.size());
// Check if one record is created in Invoivce sObject
}
}
Test Sınıfını Çalıştırmak
Test sınıfını çalıştırmak için aşağıda verilen adımları izleyin -
Step 1 - Apex sınıflarına gidin ⇒ 'CustomerTriggerTestClass' sınıf adına tıklayın.
Step 2 - Gösterildiği gibi Testi Çalıştır düğmesine tıklayın.
Step 3 - Durumu kontrol et
Step 4 - Şimdi testi yazdığımız sınıfı ve tetikleyiciyi kontrol edin
Sınıf
Tetikleyici
Testimiz başarılı ve tamamlandı.
SFDC'de Dağıtım nedir?
Şimdiye kadar Developer Edition'da kod geliştirdik, ancak gerçek hayat senaryosunda, bu geliştirmeyi Sandbox'ta yapmanız gerekiyor ve sonra bunu başka bir sanal alana veya üretim ortamına dağıtmanız gerekebilir ve buna dağıtım denir. Kısaca bu, meta verilerin bir kuruluştan diğerine hareketidir. Bunun arkasındaki sebep, Salesforce üretim organizasyonunuzda Apex geliştirememenizdir. Geliştirme sırasında sisteme erişen canlı kullanıcılar verilerinizin dengesini bozabilir veya uygulamanızı bozabilir.
Dağıtım için mevcut araçlar -
- Force.com IDE
- Setleri Değiştir
- SABUN API
- Force.com Geçiş Aracı
Geliştirici Sürümü'nü geliştirme ve öğrenme amacımız için kullandığımızdan, Değişiklik Setini veya SFDC kurumsal veya diğer ücretli sürümlere ihtiyaç duyan diğer araçları kullanamayız. Bu nedenle, bu eğitimde Force.com IDE dağıtım yöntemini ayrıntılı olarak ele alacağız.
Force.com Eclipse IDE
Step 1 - Eclipse'i açın ve dağıtılması gereken sınıf tetikleyicisini açın.
Step 2 - 'Sunucuya dağıt'ı tıkladıktan sonra, Bileşenin yerleştirilmesi gereken kuruluşun kullanıcı adını ve şifresini girin.
Yukarıda belirtilen adımları uygulayarak, Apex bileşenleriniz hedef kuruluşa dağıtılacaktır.
Değişim Seti kullanarak dağıtım
Doğrulama kurallarını, iş akışı kurallarını, Apex sınıflarını ve Tetikleyiciyi bir kuruluştan diğerine dağıtım ayarları aracılığıyla bağlayarak dağıtabilirsiniz. Bu durumda kuruluşlar birbirine bağlanmalıdır.
Dağıtım kurulumunu açmak için aşağıda verilen adımları izleyin. Bu özelliğin Geliştirici Sürümünde bulunmadığını unutmayın -
Step 1 - Kurulum'a gidin ve 'Dağıt'ı arayın.
Step 2 - Dağıtılacak değişiklik seti oluşturmak için 'Outbound Change Set' üzerine tıklayın.
Step 3 - 'Ekle' düğmesini kullanarak seti değiştirmek için bileşenleri ekleyin ve ardından Kaydet ve Yükle'yi tıklayın.
Step 4 - Hedef kuruluşa gidin ve gelen değişiklik kümesine tıklayın ve son olarak dağıtıma tıklayın.
Konuşlandırılacak SOAP API Çağrıları
Bu yaygın olarak kullanılan bir yöntem olmadığından, bu yönteme sadece küçük bir genel bakış yapacağız.
Meta verilerinizi dağıtmak için aşağıda verilen yöntem çağrılarını kullanabilirsiniz.
- compileAndTest()
- compileClasses()
- compileTriggers()
Force.com Geçiş Aracı
Bu araç, komut dosyalı dağıtım için kullanılır. Force.com Migration aracını indirmeniz gerekir ve ardından dosya tabanlı dağıtımı gerçekleştirebilirsiniz. Force.com geçiş aracını indirebilir ve ardından komut dizili dağıtımı yapabilirsiniz.