Salesforce Apex ट्यूटोरियल (शुरुआती लोगों के लिए)

⚡ स्मार्ट सारांश

Apex प्रोग्रामिंग Salesforce डेवलपर्स को CRM में कस्टम बिज़नेस लॉजिक जोड़ने के लिए एक ऑब्जेक्ट-ओरिएंटेड, स्ट्रॉन्गली टाइप्ड भाषा प्रदान करती है। यह क्लासेस, ट्रिगर्स और बैच जॉब्स को शक्ति प्रदान करती है, जबकि गवर्नर लिमिट्स साझा मल्टी-टेनेंट प्लेटफॉर्म को स्थिर बनाए रखती हैं।

  • 🧱 Foundation: Apex एक केस-इनसेंसिटिव भाषा है। Java-जैसा सिंटैक्स जो Salesforce Lightning Platform पर स्वाभाविक रूप से चलता है।
  • 🗃️ डेटा प्राप्त करना: SOQL क्वेरी और DML स्टेटमेंट आपके कोड को Salesforce डेटाबेस में sObject रिकॉर्ड को सीधे पढ़ने और लिखने की अनुमति देते हैं।
  • कार्यान्वयन: क्लासेस, प्रॉपर्टीज और ट्रिगर्स रिकॉर्ड इंसर्ट, अपडेट, डिलीट और अन्य सिस्टम इवेंट्स में कस्टम लॉजिक को संलग्न करते हैं।
  • 📦 स्केल: बैच एपेक्स और अन्य अतुल्यकालिक विकल्प प्लेटफ़ॉर्म की सीमाओं का उल्लंघन किए बिना लाखों रिकॉर्ड को टुकड़ों में संसाधित करते हैं।
  • 🚦 राज्यपाल सीमाएं: प्रति लेनदेन सीमाएं, जैसे कि 100 सिंक्रोनस SOQL क्वेरी और 150 DML स्टेटमेंट, साझा संसाधनों की सुरक्षा करती हैं।
  • गुणवत्ता: उत्पादन में तैनाती से पहले यूनिट परीक्षणों में कम से कम 75 प्रतिशत एपेक्स कोड को शामिल किया जाना चाहिए।

APEX Salesforce प्रोग्रामिंग का अवलोकन

सेल्सफोर्स में एपेक्स क्या है?

सर्वोच्च Apex एक ऑब्जेक्ट-ओरिएंटेड और स्ट्रॉन्गली टाइप्ड प्रोग्रामिंग भाषा है जिसे Salesforce ने सॉफ्टवेयर एज़ अ सर्विस (SaaS) और कस्टमर रिलेशनशिप मैनेजमेंट (CRM) एप्लिकेशन बनाने के लिए विकसित किया है। Apex डेवलपर्स को थर्ड-पार्टी SaaS एप्लिकेशन बनाने और बैक-एंड डेटाबेस सपोर्ट और क्लाइंट-सर्वर इंटरफेस प्रदान करके सिस्टम इवेंट्स में बिजनेस लॉजिक जोड़ने में मदद करता है।

Apex डेवलपर्स को बटन क्लिक, संबंधित रिकॉर्ड अपडेट और Visualforce पेज जैसे सिस्टम इवेंट्स में व्यावसायिक लॉजिक जोड़ने में मदद करता है। Apex का सिंटैक्स निम्न के समान है: Java. Salesforce के लिए पंजीकरण करें यह जानने के लिए कि सीआरएम कैसे काम करता है।

एपेक्स प्रोग्रामिंग भाषा की विशेषताएं

Salesforce Apex की महत्वपूर्ण विशेषताएं इस प्रकार हैं:

  • Apex एक केस-इनसेंसिटिव भाषा है।
  • आप Apex का उपयोग करके sObject रिकॉर्ड पर INSERT, UPDATE, UPSERT और DELETE जैसे DML ऑपरेशन कर सकते हैं।
  • आप Apex में SOQL (Salesforce Object Query Language) और SOSL (Salesforce Object Search Language) का उपयोग करके sObject रिकॉर्ड्स को क्वेरी कर सकते हैं।
  • आपको एक बनाने की अनुमति देता है अध्याय परीक्षा और सत्यापन के लिए इसे निष्पादित करें। कोड कवरेज़ और Apex में कोड की दक्षता।
  • एपेक्स एक बहु-किरायेदार वातावरण में क्रियान्वित होता है, और Salesforce Salesforce ने गवर्नर सीमाएँ निर्धारित की हैं जो उपयोगकर्ता को साझा संसाधनों पर एकाधिकार करने से रोकती हैं। Salesforce गवर्नर सीमा का उल्लंघन करने वाला कोई भी कोड विफल हो जाता है और एक त्रुटि संदेश दिखाई देता है।
  • Salesforce ऑब्जेक्ट को Apex में डेटा टाइप के रूप में उपयोग किया जा सकता है। उदाहरण के लिए:
    Account acc = new Account();

    यहां, अकाउंट एक मानक सेल्सफोर्स ऑब्जेक्ट है।

  • एपेक्स प्रत्येक सेल्सफोर्स रिलीज के साथ स्वचालित रूप से अपग्रेड हो जाता है।

किसी डेवलपर को Apex का चयन कब करना चाहिए?

Apex कोड तभी लिखा जाना चाहिए जब कोई व्यावसायिक परिदृश्य इतना जटिल हो कि Salesforce द्वारा प्रदान की गई पूर्व-निर्मित, पॉइंट-एंड-क्लिक कार्यक्षमता का उपयोग करके उसे लागू करना संभव न हो।

निम्नलिखित कुछ ऐसे परिदृश्य हैं जहाँ आपको Apex कोड लिखने की आवश्यकता होगी:

  • ऐसी वेब सेवाएँ बनाना जो Salesforce को अन्य अनुप्रयोगों के साथ एकीकृत करती हैं।
  • sObjects पर कस्टम सत्यापन लागू करने के लिए।
  • डीएमएल ऑपरेशन निष्पादित होने पर कस्टम एपेक्स लॉजिक को निष्पादित करने के लिए।
  • ऐसी कार्यक्षमता को लागू करने के लिए जिसे फ्लो जैसे मौजूदा डिक्लेरेटिव ऑटोमेशन टूल के साथ नहीं बनाया जा सकता है।
  • स्थापित करना ईमेल सेवाएं जो आने वाले ईमेल की सामग्री, हेडर और अटैचमेंट को प्रोसेस करते हैं।

एक बार जब आपको पता चल जाए कि Apex सही विकल्प है, तो अगला कदम यह समझना है कि आपके कोड को सेव करने के बाद उसके साथ क्या होता है।

एपेक्स की कार्य संरचना

Apex कोड के लिए क्रियाओं का क्रम इस प्रकार है:

  • डेवलपर कार्रवाई: जब डेवलपर कोड को प्लेटफॉर्म पर सेव करता है, तो सभी Apex कोड को निर्देशों के एक सेट में संकलित किया जाता है जिसे Apex रनटाइम इंटरप्रेटर समझ सकता है, और फिर इन निर्देशों को प्लेटफॉर्म पर मेटाडेटा के रूप में सहेजा जाता है।
  • अंतिम उपयोगकर्ता की कार्रवाई: जब कोई उपयोगकर्ता इवेंट Apex कोड को निष्पादित करता है, तो प्लेटफ़ॉर्म सर्वर मेटाडेटा से संकलित निर्देशों को पुनः प्राप्त करता है और परिणाम वापस करने से पहले उन्हें Apex दुभाषिया के माध्यम से चलाता है।

नीचे दिया गया आरेख दर्शाता है कि डेवलपर और अंतिम उपयोगकर्ता की गतिविधियाँ लाइटनिंग प्लेटफ़ॉर्म एप्लिकेशन सर्वर के साथ कैसे परस्पर क्रिया करती हैं:

एपेक्स की कार्य संरचना

शीर्ष विकास पर्यावरण

Apex कोड को Salesforce के सैंडबॉक्स या डेवलपर एडिशन ऑर्ग में विकसित किया जा सकता है।

सबसे अच्छा तरीका यह है कि कोड को सैंडबॉक्स वातावरण में विकसित किया जाए और फिर उसे उत्पादन वातावरण में तैनात किया जाए, जैसा कि नीचे दिखाया गया है:

शीर्ष विकास पर्यावरण

Apex कोड विकास उपकरण: Salesforce के सभी संस्करणों में Apex कोड विकसित करने के लिए निम्नलिखित तीन उपकरण उपलब्ध हैं:

  • डेवलपर कंसोल
  • Visual Studio Code Salesforce एक्सटेंशन पैक के साथ (यह पुराने Force.com IDE की जगह लेता है)
  • Code Salesforce सेटअप उपयोगकर्ता इंटरफ़ेस में संपादक

जब आपका वातावरण तैयार हो जाए, तो आइए भाषा के मूलभूत तत्वों को देखें, जिसकी शुरुआत डेटा प्रकारों से होती है।

Apex में डेटा प्रकार

Apex द्वारा समर्थित डेटा प्रकार निम्नलिखित हैं:

आदिम

पूर्णांक, DoubleLong, Date, Datetime, Decimal, Time, Blob, String, ID और Boolean को प्रिमिटिव डेटा टाइप माना जाता है। सभी प्रिमिटिव डेटा टाइप वैल्यू द्वारा पास किए जाते हैं, रेफरेंस द्वारा नहीं।

संग्रह

Apex में तीन प्रकार के संग्रह उपलब्ध हैं:

  • सूची: यह सूचकांकों के आधार पर प्रिमिटिव, sObjects, संग्रह या Apex ऑब्जेक्ट्स का एक क्रमबद्ध संग्रह है।
  • सेट: अद्वितीय तत्वों का एक अव्यवस्थित संग्रह जिसमें कोई दोहराव नहीं होता है।
  • नक्शा: यह अद्वितीय कुंजियों का एक संग्रह है जो एकल मानों से मैप होते हैं, जो प्रिमिटिव, sObjects, संग्रह या Apex ऑब्जेक्ट हो सकते हैं।

एसऑब्जेक्ट

यह Salesforce में एक विशेष डेटा प्रकार है। यह Salesforce में एक तालिका के समान है एसक्यूएल और इसमें SQL में कॉलम के समान फ़ील्ड शामिल हैं।

enums

एक एनम एक निरपेक्ष मान हैtract एक डेटा प्रकार है जो निर्दिष्ट पहचानकर्ताओं के एक सीमित सेट के एक मान को संग्रहीत करता है।

क्लास, ऑब्जेक्ट और इंटरफेस

उपयोगकर्ता द्वारा परिभाषित Apex क्लास और इंटरफेस का उपयोग डेटा प्रकार के रूप में भी किया जा सकता है। ऑब्जेक्ट किसी भी डेटा प्रकार के इंस्टेंस को संदर्भित करता है जो Apex में समर्थित है।

शीर्ष वाक्यविन्यास

परिवर्तनीय घोषणा

क्योंकि Apex एक स्ट्रॉन्गली टाइप्ड भाषा है, इसलिए Apex में किसी वेरिएबल को डेटा टाइप के साथ घोषित करना अनिवार्य है।

उदाहरण के लिए:

Contact con = new Contact();

यहां con नामक वेरिएबल को Contact डेटा टाइप के साथ घोषित किया गया है।

SOQL क्वेरी

SOQL का पूरा नाम Salesforce Object Query Language है। SOQL का उपयोग Salesforce डेटाबेस से sObject रिकॉर्ड प्राप्त करने के लिए किया जाता है। उदाहरण के लिए:

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

उपरोक्त क्वेरी सेल्सफोर्स डेटाबेस से एक खाता रिकॉर्ड प्राप्त करती है।

लूप स्टेटमेंट

किसी सूची में मौजूद रिकॉर्डों पर पुनरावृति करने के लिए लूप स्टेटमेंट का उपयोग किया जाता है। पुनरावृति की संख्या सूची में मौजूद रिकॉर्डों की संख्या के बराबर होती है। उदाहरण के लिए:

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

उपरोक्त कोड स्निपेट में, listOfAccounts एक List डेटा प्रकार का वेरिएबल है।

प्रवाह नियंत्रण कथन

फ्लो कंट्रोल स्टेटमेंट तब फायदेमंद होता है जब आप कुछ शर्तों के आधार पर कोड की कुछ पंक्तियों को निष्पादित करना चाहते हैं।

उदाहरण के लिए:

List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// execute the logic if the size of the account list is greater than zero
if(listOfAccounts.size() > 0){
	//your logic
}

उपरोक्त कोड का अंश डेटाबेस से खाता रिकॉर्ड प्राप्त करता है और सूची के आकार की जांच करता है।

डीएमएल विवरण

डीएमएल का मतलब डेटा मैनिपुलेशन लैंग्वेज है। डीएमएल स्टेटमेंट का उपयोग सेल्सफोर्स डेटाबेस में डेटा को मैनिपुलेट करने के लिए किया जाता है। उदाहरण के लिए:

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

एपेक्स एक्सेस स्पेसिफायर

Apex द्वारा समर्थित एक्सेस स्पेसिफायर निम्नलिखित हैं:

सार्वजनिक

यह एक्सेस स्पेसिफायर किसी क्लास, मेथड या वेरिएबल को एक्सेस प्रदान करता है जिसका उपयोग Apex द्वारा एक नेमस्पेस के भीतर किया जाएगा।

निजी

यह एक्सेस स्पेसिफायर किसी क्लास, मेथड या वेरिएबल को स्थानीय रूप से या कोड के उस भाग में उपयोग करने की अनुमति देता है जहां इसे परिभाषित किया गया है। जिन मेथड और वेरिएबल के लिए कोई एक्सेस स्पेसिफायर परिभाषित नहीं है, उन्हें डिफ़ॉल्ट रूप से 'प्राइवेट' एक्सेस स्पेसिफायर दिया जाता है।

संरक्षित

यह एक्सेस स्पेसिफायर परिभाषित Apex क्लास के भीतर मौजूद किसी भी आंतरिक क्लास द्वारा उपयोग किए जाने वाले मेथड या वेरिएबल तक पहुंच प्रदान करता है।

वैश्विक

यह एक्सेस स्पेसिफायर किसी क्लास, मेथड या वेरिएबल को नेमस्पेस के अंदर और बाहर दोनों जगह Apex द्वारा उपयोग किए जाने की अनुमति देता है। आवश्यकता पड़ने पर ही ग्लोबल कीवर्ड का उपयोग करना उचित है।

एपेक्स में कीवर्ड

साझा करने के साथ

यदि किसी क्लास को इस कीवर्ड के साथ परिभाषित किया जाता है, तो वर्तमान उपयोगकर्ता पर लागू होने वाले सभी शेयरिंग नियम लागू होते हैं। यदि यह कीवर्ड मौजूद नहीं है, तो कोड सिस्टम संदर्भ के अंतर्गत निष्पादित होता है।

उदाहरण के लिए:

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

बिना साझा किये

यदि किसी क्लास को इस कीवर्ड के साथ परिभाषित किया जाता है, तो वर्तमान उपयोगकर्ता पर लागू होने वाले साझाकरण नियम लागू नहीं होते हैं।

उदाहरण के लिए:

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

स्थिर

static कीवर्ड के साथ परिभाषित वेरिएबल या मेथड को एक बार इनिशियलाइज़ किया जाता है और उसे क्लास से संबद्ध किया जाता है। static वेरिएबल और मेथड को क्लास का इंस्टेंस बनाए बिना सीधे क्लास के नाम से कॉल किया जा सकता है।

अंतिम

final कीवर्ड के साथ परिभाषित किसी स्थिरांक या विधि को ओवरराइड नहीं किया जा सकता है। उदाहरण के लिए:

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

यदि आप इस INT_CONST वेरिएबल के मान को ओवरराइड करने का प्रयास करते हैं, तो आपको यह अपवाद मिलेगा – System.FinalException: Final वेरिएबल पहले ही इनिशियलाइज़ हो चुका है।

वापसी

यह कीवर्ड किसी विधि से मान लौटाता है। उदाहरण के लिए:

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

अशक्त

यह एक शून्य स्थिरांक को परिभाषित करता है और इसे एक चर को असाइन किया जा सकता है। उदाहरण के लिए:

Boolean b = null;

वास्तविक

यदि किसी क्लास को वर्चुअल कीवर्ड के साथ परिभाषित किया जाता है, तो उसे विस्तारित और ओवरराइड किया जा सकता है।

Abstract

यदि किसी क्लास को निरपेक्ष मान के साथ परिभाषित किया गया हैtract कीवर्ड के साथ, इसमें abs कीवर्ड वाला कम से कम एक मेथड होना चाहिए।tracऔर उस विधि में केवल एक हस्ताक्षर होना चाहिए।

उदाहरण के लिए:

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

शीर्ष स्ट्रिंग

स्ट्रिंग अक्षरों का एक समूह होता है जिसकी कोई सीमा नहीं होती। उदाहरण के लिए:

String name = 'Test';

Salesforce में String क्लास द्वारा कई अंतर्निहित विधियाँ प्रदान की जाती हैं। निम्नलिखित कुछ अक्सर उपयोग की जाने वाली विधियाँ हैं:

संक्षिप्त करें(maxWidth)

यह विधि किसी स्ट्रिंग को निर्दिष्ट लंबाई तक छोटा कर देती है और यदि दी गई स्ट्रिंग की लंबाई निर्दिष्ट लंबाई से अधिक है तो उसे लौटा देती है; अन्यथा, यह मूल स्ट्रिंग लौटा देती है। यदि maxWidth वेरिएबल का मान 4 से कम है, तो यह विधि रनटाइम अपवाद उत्पन्न करती है – System.StringException: Minimum abbreviation width is 4.

उदाहरण के लिए:

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

बड़ा करना ()

यह विधि किसी स्ट्रिंग के प्रथम अक्षर को टाइटल केस में परिवर्तित करती है और उसे वापस लौटा देती है।

उदाहरण के लिए:

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

इसमें शामिल है(सबस्ट्रिंग)

यह विधि true लौटाती है यदि विधि को कॉल करने वाली स्ट्रिंग में निर्दिष्ट सबस्ट्रिंग मौजूद है।

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

बराबर(stringOrId)

यह विधि true लौटाती है यदि पास किया गया पैरामीटर null नहीं है और उस स्ट्रिंग के समान बाइनरी वर्ण अनुक्रम का प्रतिनिधित्व करता है जो विधि को कॉल कर रही है।

आईडी मानों की तुलना करते समय, आईडी की लंबाई बराबर नहीं हो सकती है। उदाहरण के लिए, यदि 15 वर्णों वाली आईडी को दर्शाने वाली स्ट्रिंग की तुलना 18 वर्णों वाली आईडी को दर्शाने वाले ऑब्जेक्ट से की जाती है, तो भी यह विधि सही मान लौटाती है। उदाहरण के लिए:

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

उपरोक्त उदाहरण में, इक्वल्स विधि 15-अक्षर वाले ऑब्जेक्ट आईडी की तुलना 18-अक्षर वाले ऑब्जेक्ट आईडी से करती है, और यदि दोनों आईडी एक ही बाइनरी अनुक्रम का प्रतिनिधित्व करते हैं, तो यह ट्रू लौटाती है।

केस-सेंसिटिव तुलना करने के लिए इस विधि का उपयोग करें।

एस्केपसिंगलकोट्स(स्ट्रिंगटूएस्केप)

यह विधि स्ट्रिंग में किसी भी एकल उद्धरण चिह्न से पहले एक एस्केप कैरेक्टर (\) जोड़ती है और परिणाम लौटाती है। यह विधि डायनामिक SOQL क्वेरी बनाते समय SOQL इंजेक्शन को रोकती है। यह सुनिश्चित करती है कि सभी एकल उद्धरण चिह्नों को डेटाबेस कमांड के बजाय संलग्न स्ट्रिंग के रूप में माना जाए।

उदाहरण के लिए:

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

हटाएँ(सबस्ट्रिंग)

यह विधि उस स्ट्रिंग से उल्लिखित सबस्ट्रिंग के सभी उदाहरणों को हटा देती है जो विधि को कॉल करती है और परिणामी स्ट्रिंग लौटाती है।

उदाहरण के लिए:

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

सबस्ट्रिंग(स्टार्टइंडेक्स)

यह विधि एक सबस्ट्रिंग लौटाती है जो startIndex पर मौजूद कैरेक्टर से शुरू होती है और स्ट्रिंग के अंत तक फैली होती है।

उदाहरण के लिए:

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

उलटना ()

यह विधि किसी स्ट्रिंग के सभी वर्णों को उलट देती है और उसे लौटा देती है। उदाहरण के लिए:

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

ट्रिम ()

यह विधि किसी स्ट्रिंग से उसके आगे और पीछे के सभी रिक्त स्थान हटा देती है और उसे वापस लौटा देती है।

valueOf(रूपांतरित करने के लिए)

यह विधि इनपुट ऑब्जेक्ट का स्ट्रिंग प्रतिनिधित्व लौटाती है।

जब आप लॉजिक को पुन: प्रयोज्य इकाइयों में पैक करना शुरू करते हैं, तो स्ट्रिंग्स, क्लासेस और कीवर्ड एक साथ आते हैं, और एपेक्स क्लासेस का यही उद्देश्य है।

शीर्ष वर्ग

Apex क्लास एक ब्लूप्रिंट या टेम्पलेट है जिससे ऑब्जेक्ट बनाए जाते हैं। ऑब्जेक्ट एक क्लास का इंस्टेंस होता है।

Salesforce में Apex क्लास बनाने के तीन तरीके हैं:

  • डेवलपर कंसोल
  • Visual Studio Code Salesforce एक्सटेंशन पैक के साथ
  • सेटअप में एपेक्स क्लास विवरण पृष्ठ

Apex में, आप एक आउटर क्लास को परिभाषित कर सकते हैं, जिसे टॉप-लेवल क्लास भी कहा जाता है, और आप एक आउटर क्लास के भीतर भी क्लास को परिभाषित कर सकते हैं, जिन्हें इनर क्लास कहा जाता है।

बाहरी क्लास की घोषणा में ग्लोबल या पब्लिक जैसे एक्सेस मॉडिफायर का उपयोग करना अनिवार्य है।

इनर क्लास की घोषणा में एक्सेस मॉडिफायर का उपयोग करना आवश्यक नहीं है।

Apex क्लास को क्लास कीवर्ड के बाद क्लास नाम का उपयोग करके परिभाषित किया जाता है।

Apex क्लास में किसी मौजूदा क्लास को विस्तारित करने के लिए extends कीवर्ड का उपयोग किया जाता है, और Apex क्लास में किसी इंटरफ़ेस को लागू करने के लिए implements कीवर्ड का उपयोग किया जाता है।

Salesforce Apex मल्टीपल इनहेरिटेंस को सपोर्ट नहीं करता है; एक Apex क्लास केवल एक मौजूदा Apex क्लास को एक्सटेंड कर सकती है लेकिन कई इंटरफेस को इम्प्लीमेंट कर सकती है।

एक Apex क्लास में उपयोगकर्ता-परिभाषित कंस्ट्रक्टर हो सकता है, और यदि उपयोगकर्ता-परिभाषित कंस्ट्रक्टर उपलब्ध नहीं है, तो डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग किया जाता है। क्लास का इंस्टेंस बनने पर कंस्ट्रक्टर में मौजूद कोड निष्पादित होता है।

Apex क्लास का सिंटैक्स:

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

'new' कीवर्ड का उपयोग Apex क्लास का इंस्टेंस बनाने के लिए किया जाता है। Apex क्लास का इंस्टेंस बनाने का सिंटैक्स नीचे दिया गया है:

myApexClass obj = new myApexClass();

एपेक्स गेट्टर और सेटर

Apex प्रॉपर्टी, Apex वेरिएबल के समान होती है। Apex प्रॉपर्टी के लिए एक गेटर और एक सेटर आवश्यक हैं। इनका उपयोग प्रॉपर्टी के मान को एक्सेस या परिवर्तित करने से पहले कोड को निष्पादित करने के लिए किया जा सकता है। प्रॉपर्टी का मान पढ़ते समय गेट एक्सेसरी में मौजूद कोड निष्पादित होता है। प्रॉपर्टी का मान बदलते समय सेट एक्सेसरी में मौजूद कोड निष्पादित होता है। केवल गेट एक्सेसरी वाली प्रॉपर्टी को रीड-ओनली माना जाता है, केवल सेट एक्सेसरी वाली प्रॉपर्टी को राइट-ओनली माना जाता है, और गेट और सेट दोनों एक्सेसरी वाली प्रॉपर्टी को रीड-राइट माना जाता है। Apex प्रॉपर्टी का सिंटैक्स:

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

यहां, access_modifier प्रॉपर्टी का एक्सेस मॉडिफायर है, return_type प्रॉपर्टी का डेटा टाइप है, और property_name प्रॉपर्टी का नाम है।

नीचे एक Apex प्रॉपर्टी का उदाहरण दिया गया है जिसमें get और set दोनों एक्सेसर्स मौजूद हैं:

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

यहां, प्रॉपर्टी का नाम 'name' है, यह एक सार्वजनिक प्रॉपर्टी है, और यह स्ट्रिंग डेटा प्रकार लौटाती है।

गेट और सेट ब्लॉक में कोड होना अनिवार्य नहीं है। स्वचालित प्रॉपर्टी को परिभाषित करने के लिए इन ब्लॉकों को खाली छोड़ा जा सकता है। उदाहरण के लिए:

public double MyReadWriteProp{ get; set; }

गेट और सेट एक्सेसर्स को उनके अपने एक्सेस मॉडिफायर के साथ भी परिभाषित किया जा सकता है। यदि किसी एक्सेसर को मॉडिफायर के साथ परिभाषित किया जाता है, तो यह प्रॉपर्टी के एक्सेस मॉडिफायर को ओवरराइड कर देता है। उदाहरण के लिए:

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

क्लासेस पुन: प्रयोज्य लॉजिक को परिभाषित करती हैं जिन्हें आप स्पष्ट रूप से कॉल करते हैं। ट्रिगर्स, जिनके बारे में आगे बताया जाएगा, रिकॉर्ड में बदलाव होने पर स्वचालित रूप से चलते हैं।

एपेक्स ट्रिगर

Apex ट्रिगर्स आपको DML ऑपरेशन किए जाने से पहले और बाद में कस्टम Apex कोड को निष्पादित करने में सक्षम बनाते हैं।

Apex निम्नलिखित दो प्रकार के ट्रिगर्स का समर्थन करता है:

ट्रिगर्स से पहले: इन ट्रिगर्स का उपयोग डेटाबेस में रिकॉर्ड सहेजे जाने से पहले किसी फ़ील्ड के मान को मान्य करने और अपडेट करने के लिए किया जाता है।

ट्रिगर्स के बाद: इन ट्रिगर्स का उपयोग डेटाबेस में रिकॉर्ड दर्ज होने के बाद सिस्टम द्वारा निर्धारित फ़ील्ड मानों (जैसे रिकॉर्ड आईडी और लास्टमॉडिफाइडडेट फ़ील्ड) तक पहुँचने के लिए किया जाता है। इन फ़ील्ड मानों का उपयोग अन्य रिकॉर्ड को संशोधित करने के लिए किया जा सकता है। ट्रिगर्स के बाद सक्रिय होने वाले रिकॉर्ड केवल पढ़ने योग्य होते हैं।

बल्क ट्रिगर लिखना एक बेहतर तरीका है। बल्क ट्रिगर एक साथ एक रिकॉर्ड के साथ-साथ कई रिकॉर्ड भी प्रोसेस कर सकता है।

Apex ट्रिगर का सिंटैक्स:

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

यहां, TriggerName ट्रिगर का नाम है, ObjectName उस ऑब्जेक्ट का नाम है जिस पर ट्रिगर लिखा गया है, और trigger_events घटनाओं की अल्पविराम से अलग की गई सूची है।

Apex ट्रिगर्स द्वारा समर्थित इवेंट्स निम्नलिखित हैं: इंसर्ट से पहले, अपडेट से पहले, डिलीट से पहले, इंसर्ट के बाद, अपडेट के बाद, डिलीट के बाद, अनडिलीट के बाद।

Apex ट्रिगर में स्टैटिक कीवर्ड का उपयोग नहीं किया जा सकता है। इनर क्लास पर लागू होने वाले सभी कीवर्ड का उपयोग Apex ट्रिगर में किया जा सकता है।

प्रत्येक ट्रिगर द्वारा परिभाषित अंतर्निहित चर रन-टाइम संदर्भ लौटाते हैं। ये चर System.Trigger वर्ग में परिभाषित होते हैं और इन्हें संदर्भ चर कहा जाता है। नीचे दिए गए दो स्क्रीनशॉट Apex ट्रिगर्स द्वारा समर्थित संदर्भ चरों को सूचीबद्ध करते हैं:

एपेक्स ट्रिगर संदर्भ चर

एपेक्स ट्रिगर संदर्भ चर (जारी)

Apex ट्रिगर्स में संदर्भ चर के लिए निम्नलिखित बातों पर विचार करना आवश्यक है:

  • डीएमएल ऑपरेशंस में trigger.new और trigger.old का उपयोग न करें।
  • Trigger.new को हटाया नहीं जा सकता।
  • ट्रिगर के बाद Trigger.new केवल पढ़ने योग्य होता है।
  • Trigger.new का उपयोग केवल before ट्रिगर्स में एक ही ऑब्जेक्ट पर फ़ील्ड के मानों को बदलने के लिए किया जा सकता है।

नीचे दिए गए दो स्क्रीनशॉट विभिन्न ट्रिगर घटनाओं में विशिष्ट कार्यों के बारे में विचारणीय बातों को सूचीबद्ध करते हैं:

एपेक्स ट्रिगर इवेंट संबंधी विचार

एपेक्स ट्रिगर इवेंट संबंधी विचार (जारी)

ट्रिगर्स रीयल-टाइम लॉजिक को संभालते हैं, लेकिन कुछ कार्य इतने बड़े होते हैं कि उन्हें एक ही लेनदेन में पूरा करना संभव नहीं होता। यहीं पर बैच एपेक्स काम आता है।

एपेक्स में बैच क्लास

Salesforce में बैच क्लास का उपयोग बड़ी संख्या में रिकॉर्ड्स को प्रोसेस करने के लिए किया जाता है, जो सामान्य रूप से प्रोसेस किए जाने पर Apex गवर्नर की सीमा से अधिक हो जाएंगे। बैच क्लास कोड को अतुल्यकालिक रूप से निष्पादित करती है।

बैच क्लास के निम्नलिखित फायदे हैं:

  • एक बैच क्लास डेटा को टुकड़ों में प्रोसेस करती है, और यदि कोई एक टुकड़ा सफलतापूर्वक प्रोसेस नहीं हो पाता है, तो सफलतापूर्वक प्रोसेस किए गए टुकड़ों को वापस नहीं लिया जाता है।
  • बैच क्लास में डेटा के प्रत्येक भाग को गवर्नर सीमाओं के एक नए सेट के साथ संसाधित किया जाता है, जो यह सुनिश्चित करता है कि कोड गवर्नर निष्पादन सीमाओं के भीतर निष्पादित हो।

किसी Apex क्लास को बैच क्लास के रूप में उपयोग करने के लिए Database.Batchable इंटरफ़ेस को इम्प्लीमेंट किया जाना आवश्यक है। यह तीन मेथड प्रदान करता है जिन्हें बैच क्लास द्वारा इम्प्लीमेंट किया जाना चाहिए:

1. प्रारंभ()

यह विधि execute इंटरफ़ेस विधि द्वारा संसाधित किए जाने वाले रिकॉर्ड या ऑब्जेक्ट के दायरे को निर्धारित करती है। बैच के निष्पादन के दौरान इसे केवल एक बार कॉल किया जाता है। यह विधि या तो Database.QueryLocator ऑब्जेक्ट या Iterable लौटाती है। Database.QueryLocator ऑब्जेक्ट का उपयोग करके SOQL क्वेरी द्वारा पुनर्प्राप्त किए जा सकने वाले रिकॉर्ड की संख्या 50 मिलियन है, लेकिन Iterable का उपयोग करके SOQL क्वेरी द्वारा पुनर्प्राप्त किए जा सकने वाले रिकॉर्ड की कुल संख्या केवल 50,000 है। Iterable का उपयोग बैच क्लास के लिए एक जटिल दायरा उत्पन्न करने के लिए किया जाता है।

स्टार्ट मेथड का सिंटैक्स:

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

2. निष्पादित करें()

इस विधि का उपयोग डेटा के प्रत्येक भाग को संसाधित करने के लिए किया जाता है। प्रत्येक रिकॉर्ड के भाग के लिए execute विधि को कॉल किया जाता है। निष्पादन के लिए डिफ़ॉल्ट बैच आकार 200 रिकॉर्ड है। execute विधि दो तर्क लेती है:

Database.BatchableContext ऑब्जेक्ट का संदर्भ,

sObjects की एक सूची, जैसे कि List या पैरामीटराइज्ड प्रकारों की सूची। एक्जीक्यूट विधि का सिंटैक्स:

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

3. समाप्त करें()

बैच क्लास के निष्पादन के दौरान फ़िनिश विधि को एक बार कॉल किया जाता है। फ़िनिश विधि में पोस्ट-प्रोसेसिंग ऑपरेशन किए जा सकते हैं। उदाहरण के लिए: पुष्टिकरण ईमेल भेजना। यह विधि तब कॉल की जाती है जब सभी बैच संसाधित हो जाते हैं। फ़िनिश विधि का सिंटैक्स:

global void finish(Database.BatchableContext bc){}

डेटाबेस.बैचेबलकॉन्टेक्स्ट ऑब्जेक्ट

Database.Batchable इंटरफ़ेस के प्रत्येक मेथड में Database.BatchableContext ऑब्जेक्ट का संदर्भ होता है।

इस वस्तु का उपयोग किया जाता है tracबैच जॉब की प्रगति की निगरानी करें।

BatchableContext द्वारा प्रदान किए गए इंस्टेंस मेथड निम्नलिखित हैं:

  • getChildJobId(): यह विधि उस बैच जॉब की आईडी लौटाती है जिसे वर्तमान में संसाधित किया जा रहा है।
  • getJobId(): यह विधि बैच जॉब की आईडी लौटाती है।

नीचे बैच क्लास का सिंटैक्स दिया गया है:

global class MyBatchClass implements Database.Batchable<sObject> {
	global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContext bc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}

डेटाबेस.executeBatch विधि

Database.executeBatch विधि का उपयोग बैच क्लास को निष्पादित करने के लिए किया जाता है।

यह विधि दो पैरामीटर लेती है: संसाधित की जाने वाली बैच क्लास का एक इंस्टेंस, और बैच आकार निर्दिष्ट करने के लिए एक वैकल्पिक स्कोप पैरामीटर। यदि इसे निर्दिष्ट नहीं किया जाता है, तो डिफ़ॉल्ट आकार 200 का उपयोग किया जाता है।

Database.executeBatch का सिंटैक्स:

Database.executeBatch(myBatchObject, scope)

MyBatchClass नामक बैच क्लास को निष्पादित करना:

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

डेटाबेस.स्टेटफुल

बैच क्लास डिफ़ॉल्ट रूप से स्टेटलेस होती है। हर बार जब execute मेथड को कॉल किया जाता है, तो ऑब्जेक्ट की एक नई कॉपी प्राप्त होती है और क्लास के सभी वेरिएबल्स इनिशियलाइज़ हो जाते हैं।

Database.Stateful का उपयोग बैच क्लास को स्टेटफुल बनाने के लिए किया जाता है।

यदि आपकी बैच क्लास इसे लागू करती है डाटाबेसस्टेटफुल इंटरफेस में, सभी इंस्टेंस वेरिएबल अपने मानों को बनाए रखते हैं, लेकिन स्टैटिक वेरिएबल लेनदेन के बीच रीसेट हो जाते हैं।

अतुल्यकालिक एपेक्स बियॉन्ड बैच

बैच एपेक्स कोड को अतुल्यकालिक रूप से चलाने के कई तरीकों में से एक है। सेल्सफोर्स चार अतुल्यकालिक विकल्प प्रदान करता है, और सही विकल्प का चुनाव इस बात पर निर्भर करता है कि आप कितना डेटा संसाधित करते हैं और क्या जॉब्स को एक साथ चलाने या शेड्यूल करने की आवश्यकता है।

  • भविष्य की विधियाँ: @future एनोटेशन के साथ, ये सरल, फायर-एंड-फॉरगेट ऑपरेशंस जैसे कि बाहरी वेब सेवाओं को कॉल करने के लिए सबसे उपयुक्त हैं।
  • क्यूएबल एपेक्स: यह Queueable इंटरफ़ेस को लागू करता है, जटिल ऑब्जेक्ट प्रकारों को स्वीकार करता है, एक जॉब आईडी लौटाता है, और एक जॉब को दूसरे से जोड़ने का समर्थन करता है।
  • बैच एपेक्स: यह ऊपर वर्णित अनुसार, बहुत बड़े डेटा वॉल्यूम को टुकड़ों में संसाधित करता है।
  • निर्धारित शीर्ष बिंदु: यह शेड्यूलेबल इंटरफेस को लागू करता है ताकि एक क्लास एक विशिष्ट समय पर चले, जैसे कि रात में सफाई का काम।
प्रकार सबसे अच्छा है प्रमुख क्षमता
भविष्य की विधि सरल कॉलआउट आग लगाओ और भूल जाओ
कतारबद्ध शीर्ष अनुक्रमिक प्रसंस्करण कार्य श्रृंखला और निगरानी
बैच एपेक्स लाखों रिकॉर्ड खंडित प्रसंस्करण
अनुसूचित शीर्ष आवर्ती नौकरियां क्रॉन-आधारित समय निर्धारण

आप चाहे जो भी निष्पादन मॉडल चुनें, प्रत्येक लेनदेन को नीचे सूचीबद्ध प्लेटफ़ॉर्म-व्यापी गवर्नर सीमाओं के विरुद्ध मापा जाता है।

शीर्ष गवर्नर की सीमाएं

Apex गवर्नर सीमाएँ वे सीमाएँ हैं जिन्हें Apex रनटाइम इंजन द्वारा लागू किया जाता है ताकि यह सुनिश्चित किया जा सके कि कोई भी अनियंत्रित Apex कोड और प्रक्रियाएँ साझा संसाधनों पर एकाधिकार न कर लें और मल्टी-टेनेंट वातावरण में अन्य उपयोगकर्ताओं के प्रसंस्करण को बाधित न करें। इन सीमाओं की जाँच प्रत्येक Apex लेनदेन के विरुद्ध की जाती है। Salesforce द्वारा प्रत्येक Apex लेनदेन पर परिभाषित गवर्नर सीमाएँ निम्नलिखित हैं:

विवरण सीमा
SOQL क्वेरीज़ जो समकालिक लेनदेन में की जा सकती हैं 100
एसओसीएल क्वेरीज़ जिन्हें अतुल्यकालिक लेनदेन में किया जा सकता है 200
रिकॉर्ड जिन्हें SOQL क्वेरी द्वारा प्राप्त किया जा सकता है 50,000
Database.getQueryLocator द्वारा प्राप्त किए जा सकने वाले रिकॉर्ड 10,000
SOSL क्वेरीज़ जिन्हें Apex ट्रांज़ैक्शन में किया जा सकता है 20
रिकॉर्ड जिन्हें SOSL क्वेरी द्वारा प्राप्त किया जा सकता है 2,000
DML स्टेटमेंट जिन्हें Apex ट्रांजैक्शन में किया जा सकता है 150
वे रिकॉर्ड जिन्हें DML कथन, Approval.process, या database.emptyRecycleBin के परिणामस्वरूप संसाधित किया जा सकता है 10,000
Apex ट्रांज़ैक्शन में किए जा सकने वाले कॉलआउट 100
Apex लेनदेन में निष्पादित होने वाले सभी कॉलआउट पर संचयी टाइमआउट सीमा 120 सेकंड
System.enqueueJob का उपयोग करके कतार में जोड़े जा सकने वाले Apex जॉब्स पर सीमा। 50
प्रत्येक एपेक्स लेनदेन के लिए निष्पादन समय सीमा 10 मिनट
Apex क्लास और ट्रिगर में उपयोग किए जा सकने वाले वर्णों की सीमा 1 लाख
सिंक्रोनस लेनदेन के लिए सीपीयू समय सीमा 10,000 मिसे
अतुल्यकालिक लेनदेन के लिए सीपीयू समय सीमा 60,000 मिसे
कुल ढेर का आकार 6 एमबी (सिंक्रोनस) / 12 एमबी (असिंक्रोनस)

Apex में टेस्ट क्लास कैसे लिखें

Salesforce की आवश्यकता है कि उत्पादन में परिनियोजन से पहले आपके Apex कोड का कम से कम 75 प्रतिशत भाग यूनिट परीक्षणों द्वारा कवर किया गया हो, और प्रत्येक ट्रिगर का कुछ न कुछ परीक्षण होना अनिवार्य है। इसलिए, परीक्षण क्लास लिखना Apex का एक मूलभूत कौशल है, न कि कोई वैकल्पिक कौशल।

टेस्ट क्लास को @isTest एनोटेशन से चिह्नित किया जाता है, और प्रत्येक टेस्ट मेथड को भी @isTest से चिह्नित किया जाता है। टेस्ट मेथड डेटाबेस में डेटा कमिट नहीं करते हैं और अधिकांश मौजूदा ऑर्ग डेटा को नहीं देखते हैं, इसलिए प्रत्येक टेस्ट अपने स्वयं के रिकॉर्ड बनाता है। Test.startTest() और Test.stopTest() मेथड परीक्षण किए जा रहे कोड को गवर्नर लिमिट्स का एक नया सेट प्रदान करते हैं, और असर्शन यह सत्यापित करते हैं कि लॉजिक ने अपेक्षा के अनुसार काम किया।

यहां खाता निर्माण तर्क के लिए एक सरल परीक्षण वर्ग दिया गया है:

@isTest
private class AccountHandlerTest {
    @isTest
    static void testCreateAccount() {
        Account acc = new Account(Name = 'Test Account');
        Test.startTest();
        insert acc;
        Test.stopTest();
        Account result = [SELECT Id, Name FROM Account WHERE Id = :acc.Id];
        System.assertEquals('Test Account', result.Name);
    }
}

टेस्ट लिखते समय इन दिशानिर्देशों का पालन करें:

  • क्लास में मौजूद सभी टेस्ट मेथड्स के लिए एक बार साझा टेस्ट डेटा बनाने के लिए @testSetup मेथड का उपयोग करें।
  • एक साथ 200 रिकॉर्ड डालकर बल्क व्यवहार का परीक्षण करें, सिर्फ एक रिकॉर्ड नहीं।
  • सकारात्मक, नकारात्मक और प्रतिबंधित उपयोगकर्ता परिदृश्यों को कवर करें।
  • हमेशा सार्थक System.assert स्टेटमेंट शामिल करें; बिना असर्शन के कवरेज कुछ भी साबित नहीं करता।

एपेक्स सर्वोत्तम अभ्यास

शुरुआती लोग अक्सर ऐसा Apex कोड लिखते हैं जो एक रिकॉर्ड के लिए तो ठीक काम करता है लेकिन वास्तविक दुनिया के बल्क ऑपरेशन्स में विफल हो जाता है। नीचे दिए गए तरीके आपके कोड को गवर्नर लिमिट के भीतर रखते हैं और इसे बनाए रखना आसान बनाते हैं:

  • हर चीज को बल्क में बदलें: रिकॉर्ड के संग्रह को संभालने के लिए लॉजिक लिखें, क्योंकि ट्रिगर एक ही बैच में 200 रिकॉर्ड तक प्राप्त कर सकते हैं।
  • SOQL और DML को इस प्रक्रिया से बाहर रखें: लूप से पहले क्वेरी करें, परिवर्तनों को एक सूची में एकत्रित करें, और लूप के बाद एक डीएमएल स्टेटमेंट निष्पादित करें।
  • प्रति ऑब्जेक्ट एक ट्रिगर: ट्रिगर्स को लॉजिक-फ्री रखें और काम को हैंडलर क्लास को सौंप दें, जिससे निष्पादन का क्रम अनुमानित हो जाता है।
  • साझा करने के साथ उपयोग करें: जब तक सिस्टम संदर्भ में चलाने का कोई दस्तावेजी कारण न हो, तब तक रिकॉर्ड-स्तर की सुरक्षा लागू करें।
  • आईडी को हार्डकोड करने से बचें: सैंडबॉक्स और प्रोडक्शन के बीच रिकॉर्ड आईडी अलग-अलग होते हैं, इसलिए उनके लिए क्वेरी करें या कस्टमडेटा का उपयोग करें।
  • कोड में मॉनिटर सीमाएं: Limits क्लास के मेथड, जैसे कि Limits.getQueries(), आपको रनटाइम पर रिसोर्स की खपत की जांच करने की अनुमति देते हैं।

💡 सुझाव: डिप्लॉय करने से पहले सैंडबॉक्स में 200 रिकॉर्ड पर अपना कोड चलाकर देखें। गवर्नर लिमिट की अधिकांश विफलताएँ केवल बल्क वॉल्यूम पर ही दिखाई देती हैं, और उन्हें शुरुआत में ही पकड़ना प्रोडक्शन में डीबग करने की तुलना में कहीं अधिक सस्ता होता है।

अक्सर पूछे जाने वाले प्रश्न

नहीं। एपेक्स उधार लेता है Javaइसका सिंटैक्स -जैसा है, लेकिन यह केस-इनसेंसिटिव है, केवल Salesforce Lightning Platform पर चलता है, SOQL को सीधे भाषा में एकीकृत करता है, और प्रति-लेनदेन सीमाओं द्वारा नियंत्रित होता है। Java नहीं है।

एक निःशुल्क Salesforce डेवलपर एडिशन ऑर्ग के लिए साइन अप करें, जिसमें डेवलपर कंसोल शामिल है, और व्यावहारिक अभ्यासों का पालन करें। रास्ते के एक किनारेSalesforce का आधिकारिक लर्निंग प्लेटफॉर्म।

Visualforce एक मार्कअप भाषा है जिसका उपयोग यूजर इंटरफेस पेज बनाने के लिए किया जाता है, जबकि Apex सर्वर-साइड भाषा है जो इन पेजों के पीछे का लॉजिक प्रदान करती है। Visualforce पेज अक्सर डेटा को क्वेरी करने और अपडेट करने के लिए Apex कंट्रोलर क्लास को कॉल करते हैं।

हां. डेवलपर्स के लिए एजेंटफोर्सSalesforce का AI सहायक Visual Studio Codeयह प्राकृतिक भाषा के संकेतों से Apex कोड उत्पन्न करता है और उसकी व्याख्या करता है। परिनियोजन से पहले हमेशा AI द्वारा उत्पन्न कोड की समीक्षा करें और गवर्नर सीमाओं के विरुद्ध उसका परीक्षण करें।

@InvocableMethod एनोटेशन से चिह्नित Apex क्लास को कस्टम एक्शन के रूप में उजागर किया जा सकता है, जिससे आइंस्टीन बॉट और एजेंटफोर्स एजेंट आपके व्यावसायिक तर्क को कॉल कर सकते हैं, जबकि Apex प्लेटफ़ॉर्म API के माध्यम से आइंस्टीन प्रॉम्प्ट टेम्प्लेट और AI मॉडल को भी इनवोक कर सकता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: