Урок за APEX: Класове за програмиране на Apex и примери за кодиране
Какво е Apex в Salesforce?
Връх е обектно-ориентиран и строго типизиран език за програмиране, разработен от Salesforce за изграждане на софтуер като услуга (SaaS) и управление на взаимоотношенията с клиенти (CRM). Apex помага на разработчиците да създават SaaS приложения на трети страни и да добавят бизнес логика към системните събития, като предоставя поддръжка на базата данни от задния край и интерфейси клиент-сървър.
Apex помага на разработчиците да добавят бизнес логика към системните събития като щраквания върху бутони, свързани актуализации на записи и страници на Visualforce. Apex има подобен синтаксис на Java. Регистрирайте се за Salesforce за да научите как работи CRM
Характеристики на езика за програмиране Apex
Ето важните характеристики на Salesforce Apex:
- Apex е език, който не различава малки и големи букви.
- Можете да извършвате DML операции като INSERT, UPDATE, UPSERT, DELETE върху sObject записи, като използвате apex.
- Можете да правите заявки за записи на sObject, като използвате SOQL (език за заявки на обекти на Salesforce) и SOSL (език за търсене на обекти на Salesforce) в apex.
- Позволява ви да създадете a единица тест и ги изпълнете, за да проверите покритие на кода и ефективността на кода във връх.
- Apex се изпълнява в среда с множество наематели и Salesforce е дефинирал някои ограничения на управителя, които не позволяват на потребителя да контролира споделените ресурси. Всеки код, който пресича лимита на управителя на salesforce, се проваля, появява се грешка.
- Обектът на Salesforce може да се използва като тип данни в apex. Например –
Account acc = new Account();
, тук акаунтът е стандартен обект на salesforce.
- Apex автоматично се надгражда с всяко издание на Salesforce.
Кога програмистът трябва да избере Apex
Apex кодът трябва да се пише само ако даден бизнес сценарий е твърде сложен и не може да бъде внедрен с помощта на предварително изградената функционалност, предоставена от Salesforce.
Следват няколко сценария, при които трябва да напишем апекс код:
- За създаване на уеб услуги, които интегрират Salesforce с други приложения.
- За прилагане на персонализирано валидиране на обекти.
- За изпълнение на персонализирана апекс логика, когато се изпълнява DML операция.
- За внедряване на функционалност, която не може да бъде внедрена с помощта на съществуващи потоци на работни потоци и функционалност за създатели на процеси.
- Нагласям имейл услуги, трябва да включите обработка на съдържанието, заглавките и прикачените файлове на имейли с помощта на apex код.
Работна структура на Apex
Сега в този урок за Apex ще научим за работната структура на Apex:
Следва поток от действия за апекс код:
- Действие на разработчика: Целият apex код, написан от разработчик, се компилира в набор от инструкции, които могат да бъдат разбрани от apex runtime интерпретатора, когато разработчикът запише кода в платформата и тези инструкции след това се запишат като метаданни в платформата.
- Действие на крайния потребител: Когато потребителското събитие изпълни apex код, сървърът на платформата получава компилираните инструкции от метаданни и ги пуска през apex интерпретатора, преди да върне резултата.
Apex Синтаксис
Декларация за променлива
Тъй като apex е строго типизиран език, задължително е да се декларира променлива с тип данни в apex.
Например:
contact con = new contact();
тук променливата con е декларирана с contact като тип данни.
SOQL заявка
SOQL означава salesforce object query language. SOQL се използва за извличане на sObject записи от база данни на Salesforce. например-
Account acc = [select id, name from Account Limit 1];
Горната заявка извлича запис на акаунт от базата данни на Salesforce.
Инструкция за цикъл
Инструкцията за цикъл се използва за обхождане на записите в списък. Броят на итерациите е равен на броя на записите в списъка. Например:
list<Account>listOfAccounts = [select id, name from account limit 100]; // iteration over the list of accounts for(Account acc : listOfAccounts){ //your logic }
В горния кодов фрагмент listOfAccounts е променлива от тип данни списък.
Изявление за контрол на потока
Изявлението за контрол на потока е полезно, когато искате да изпълните някои редове от кода въз основа на определени условия.
Например:
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 }
Горният кодов фрагмент прави заявка за записи на акаунти от базата данни и проверява размера на списъка.
DML изявление
DML означава език за манипулиране на данни. DML изразите се използват за манипулиране на данни в базата данни на Salesforce. Например –
Account acc = new Account(Name = ‘ Test Account’); Insert acc; //DML statement to create account record.
Среда за разработка Apex
Сега в този урок по програмиране на Apex ще научим за средата за разработка на Apex:
Apex кодът може да бъде разработен или в пясъчна среда, и в изданието за разработчици на Salesforce.
Най-добрата практика е да разработите кода в средата на пясъчника и след това да го внедрите в производствената среда.
Инструменти за разработка на Apex код: Следват трите налични инструмента за разработване на Apex код във всички издания на Salesforce.
- Force.com конзола за разработчици
- Force.com IDE
- Редактор на код в потребителския интерфейс на Salesforce Вие
Тип данни в Apex
Следват типовете данни, поддържани от apex:
Примитивен
Цяло число, Double, Long, Date, Date Time, String, ID и Boolean се считат за примитивни типове данни. Всички примитивни типове данни се предават по стойност, а не по препратка.
колекции
В Apex се предлагат три вида колекция
- Списък: Това е подредена колекция от примитиви, sObjects, колекции или Apex обекти, базирани на индекси.
- Комплект: Неподредена колекция от уникални примитиви.
- Карта: Това е колекция от уникални, примитивни ключове, които се преобразуват в единични стойности, които могат да бъдат примитиви, sObjects, колекции или Apex обекти.
sОбект
Това е специален тип данни в Salesforce. Подобно е на маса в SQL и съдържа полета, които са подобни на колони в SQL.
Преброявания
Enum е абстрактен тип данни, който съхранява една стойност на краен набор от определени идентификатори
Класове
Заведения
Отнася се за всеки тип данни, който се поддържа в Apex.
Интерфейси
Спецификатор за достъп Apex
Следват спецификаторите за достъп, поддържани от apex:
Обществен
Този спецификатор на достъп дава достъп до клас, метод, променлива, които да бъдат използвани от апекс в пространството от имена.
частен
Този спецификатор на достъп дава достъп до клас, метод, променлива, които да се използват локално или в рамките на секцията от код, която е дефинирана. Всички технически променливи, които нямат дефиниран спецификатор за достъп, имат спецификатор за достъп по подразбиране на private.
Защитена
Този спецификатор на достъп дава достъп до метод, променлива, която да се използва от всички вътрешни класове в дефиниращия клас Apex.
В световен мащаб
Този спецификатор на достъп дава достъп до клас, метод, променлива, които да бъдат използвани от апекс в пространството от имена, както и извън пространството от имена. Най-добрата практика е да не използвате глобална ключова дума, докато не е необходимо.
Ключови думи в Apex
Със споделяне
Ако даден клас е дефиниран с тази ключова дума, всички правила за споделяне, приложими към текущия потребител, се прилагат и ако тази ключова дума отсъства, кодът се изпълнява в контекста на системата.
Например:
public with sharing class MyApexClass{ // sharing rules enforced when code in this class execute }
Без споделяне
Ако даден клас е дефиниран с тази ключова дума, всички правила за споделяне, приложими към текущия потребител, не се прилагат.
Например:
public without sharing class MyApexClass{ // sharing rules is not enforced when code in this class execute }
Статичен
Променлива, методът се дефинира с ключовата дума static, инициализира се веднъж и се свързва с класа. Статичните променливи, методите могат да се извикват директно по име на клас, без да се създава екземпляр на клас.
Окончателен
Константа, методът е дефиниран с ключова дума final, която не може да бъде заменена. Например:
public class myCls { static final Integer INT_CONST = 10; }
Ако се опитате да замените стойността за тази променлива INT_CONST, тогава ще получите изключение – System.FinalException: Крайната променлива вече е инициализирана.
връщане
Тази ключова дума връща стойност от метод. Например:
public String getName() { return 'Test' ; }
Null
Той дефинира нулева константа и може да бъде присвоен на променлива. например
Boolean b = null;
Фактически
Ако даден клас е дефиниран с виртуална ключова дума, той може да бъде разширен и заменен.
абстрактен
Ако даден клас е дефиниран с ключова дума abstract, той трябва да съдържа поне един метод с ключова дума abstract и този метод трябва да има само сигнатура.
Например
public abstract class MyAbstrtactClass { abstract Integer myAbstractMethod1(); }
Apex String
Низът е набор от знаци без ограничения за знаци. Например:
String name = 'Test';
Има няколко вградени метода, предоставени от клас String в salesforce. Следват няколко често и най-често използвани функции:
съкращаване (maxWidth)
Този метод съкращава низ до посочената дължина и го връща, ако дължината на дадения низ е по-голяма от посочената дължина; в противен случай връща оригиналния низ. Ако стойността за променливата maxWidth е по-малка от 4, този метод връща изключение по време на изпълнение – System.StringException: Минималната ширина на съкращението е 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, извикващ метода, съдържа посочения подниз.
String name1 = 'test1'; String name2 = 'test2'; Boolean flag = name.contains(name2); System.debug('flag::',+flag); //true
се равнява на (stringOrId)
Този метод връща true, ако подаваният параметър не е null и показва същата двоична последователност от знаци като низа, който извиква метода.
Докато сравнявате стойностите на идентификаторите, дължината на идентификаторите може да не е еднаква. Например: ако низ, който представлява идентификатор от 15 знака, се сравни с обект, който представлява идентификатор от 18 знака, този метод връща true. Например:
Id idValue15 = '001D000000Ju1zH'; Id idValue18 = '001D000000Ju1zHIAR'; Boolean result4 = stringValue15.equals(IdValue18); System.debug('result4', +result4); //true
В горния пример методът equals сравнява 15 знаков идентификатор на обект с 18 знаков идентификатор на обект и ако и двата идентификатора представляват една и съща двоична последователност, той ще върне истина.
Използвайте този метод, за да правите сравнения с малки и големи букви.
escapeSingleQuotes(stringToEscape)
Този метод добавя екраниращ знак (\) преди всяка единична кавичка в низ и го връща. Този метод предотвратява въвеждането на SOQL при създаване на динамична SOQL заявка. Този метод гарантира, че всички единични кавички се считат за обхващащи низове, вместо команди на базата данни.
Например:
String s = 'Hello Tom'; system.debug(s); // Outputs 'Hello Tom' String escapedStr = String.escapeSingleQuotes(s); // Outputs \'Hello Tom\'
премахване (подниз)
Този метод премахва всички случаи на споменатия подниз от String, който извиква метода и връща получения низ.
Например
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 // Hello
trim(): Този метод премахва всички водещи бели интервали от низ и го връща.
valueOf(toConvert)
Този метод връща низовото представяне на подаден обект.
Лимити на управителя на Apex
Ограниченията на управителя на Apex са ограниченията, наложени от машината за изпълнение на apex, за да се гарантира, че всеки код и процеси на apex на писта не контролират споделените ресурси и не нарушават обработката за други потребители в мултитенантната среда. Тези лимити се проверяват спрямо всяка апекс транзакция. Следват ограниченията на управителя, определени от отдела за продажби за всяка върхова транзакция:
Descriptйон | Граница |
---|---|
SOQL заявки, които могат да бъдат направени в синхронна транзакция | 100 |
SOQL заявки, които могат да бъдат направени в асинхронна транзакция | 200 |
Записи, които могат да бъдат извлечени чрез SOQL заявка | 50000 |
Записи, които могат да бъдат извлечени от Database.getQueryLocator | 10000 |
SOSL заявки, които могат да бъдат направени в апекс транзакция | 20 |
Записи, които могат да бъдат извлечени чрез SOSL заявка | 2000 |
DML изрази, които могат да бъдат направени в апекс транзакция | 150 |
Записи, които могат да бъдат обработени в резултат на DML израз, Approval.process или database.emptyRecycleBin | 10000 |
Описвания, които могат да бъдат направени в апекс транзакция. | 100 |
Кумулативен лимит за изчакване за всички извиквания, които се изпълняват в апекс транзакция | 120 секунди |
Ограничете апекс заданията, които могат да се добавят към опашката с System.enqueueJob | 50 |
Ограничение във времето за изпълнение за всяка Apex транзакция | 10 минути |
Ограничение на знаците, които могат да се използват в апекс клас и тригер | 1 милиона |
Времево ограничение на процесора за синхронна транзакция | 10,000 милисекунди |
Времево ограничение на процесора за асинхронна транзакция | 60,000 милисекунди |
Apex Getter и Setter
Свойството Apex е подобно на променливата apex. Getter и setter са необходими за апекс свойство. Getter и setter могат да се използват за изпълнение на код преди стойността на свойството да бъде достъпна или променена. Кодът в инструмента за достъп се изпълнява, когато се прочете стойност на свойството. Кодът в инструмента за достъп на набор се изпълнява, когато стойността на свойството се промени. Всяко свойство, което има достъп за получаване, се счита за само за четене, всяко свойство, което има достъп за задаване, се счита за записващо, всяко свойство, което има достъп за получаване и задаване, се счита за четене и запис. Синтаксис на свойство на върха:
public class myApexClass { // Property declaration access_modifierreturn_typeproperty_name { get { //code } set{ //code } }
Тук access_modifier е модификаторът за достъп на свойството. return_type е dataType на свойството. property_name е името на свойството.
По-долу е даден пример за свойство на апекс, което има както get, така и set accessor.
public class myApex{ public String name{ get{ return name;} set{ name = 'Test';} } }
Тук името на свойството е name и е публична собственост и връща низ dataType.
Не е задължително да има някакъв код в блока get и set. Тези блокове могат да бъдат оставени празни, за да се дефинира автоматично свойство. Например:
public double MyReadWriteProp{ get; set; }
Аксесорът за получаване и задаване може също да бъде дефиниран с техния модификатор за достъп. Ако средство за достъп е дефинирано с модификатор, тогава той отменя модификатора за достъп за свойството. Например:
public String name{private get; set;}// name is private for read and public to write.
Апекс клас
Apex класът е план или шаблон, от който се създават обекти. Обектът е екземпляр на клас.
Има три начина за създаване на апекс класове в Salesforce:
Конзола за програмисти
Force.com IDE
Страница с подробности за клас Apex.
В apex можете да дефинирате външен клас, наричан още клас от най-високо ниво, и можете също да дефинирате класове във външен клас, наречен вътрешни класове.
Задължително е да използвате модификатор за достъп като global или public в декларацията на външния клас.
Не е необходимо да се използва модификатор за достъп в декларацията на вътрешните класове.
Apex клас се дефинира с помощта на ключова дума class, последвана от името на класа.
Ключовата дума Extends се използва за разширяване на съществуващ клас чрез апекс клас, а ключовата дума implements се използва за внедряване на интерфейс от апекс клас.
Salesforce Apex не поддържа множество наследявания, един апекс клас може да разшири само един съществуващ апекс клас, но може да реализира множество интерфейси.
Apex клас може да съдържа дефиниран от потребителя конструктор и ако дефиниран от потребителя конструктор не е наличен, се използва конструктор по подразбиране. Кодът в конструктора се изпълнява, когато се създаде екземпляр на клас.
Синтаксис на примера за клас Apex:
public class myApexClass{ // variable declaration //constructor public myApexClass{ } //methods declaration }
Новата ключова дума се използва за създаване на екземпляр на апекс клас. По-долу е синтаксисът за създаване на екземпляр на апекс клас.
myApexClass obj = new myApexClass();
Apex Trigger
Apex тригерите ви позволяват да изпълнявате потребителски apex преди и след извършване на DML операция.
Apex поддържа следните два типа тригери:
Преди тригери: Тези тригери се използват за валидиране и актуализиране на стойността на полето преди записът да бъде запазен в базата данни.
След тригери: Тези тригери се използват за достъп до полетата (ID на запис, поле LastModifiedDate), зададени от системата след запис, ангажиран към базата данни. Стойността на тези полета може да се използва за промяна на други записи. Записите, които се активират след задействания, са само за четене.
Най-добрата практика е да пишете обемисти тригери. Обемният тригер може да обработва единичен запис, както и множество записи наведнъж.
Синтаксис на апекс тригер:
trigger TriggerName on ObjectName (trigger_events) { //Code_block }
Тук TriggerName е името на тригера, ObjectName е името на обекта, върху който тригерът да бъде написан, trigger_events е разделеният със запетаи списък със събития.
Следват събитията, поддържани от тригерите на apex: преди вмъкване, преди актуализацията, преди изтриване, след вмъкване, след актуализация, след изтриване, след възстановяване на изтриването.
Статичните ключови думи не могат да се използват в задействане на Apex. Всички ключови думи, приложими към вътрешните класове, могат да се използват в Apex тригер.
Има имплицитна променлива, дефинирана от всеки тригер, който връща контекста по време на изпълнение. Тези променливи са дефинирани в системата. Клас на задействане. Тези променливи се наричат контекстни променливи. Екранната снимка по-долу показва контекстната променлива, поддържана от apex тригера.
Следва разглеждането на контекстната променлива в апекс тригера:
- Не използвайте trigger.new и trigger.old в DML операции.
- Trigger.new не може да бъде изтрит.
- Trigger.new е само за четене.
- Trigger.new може да се използва за промяна на стойностите на полетата на същия обект само преди задействане.
Екранните снимки по-долу изброяват съображенията относно конкретни действия при различни задействащи събития.
Пакетен клас в Apex
Пакетният клас в salesforce се използва за обработка на голям брой записи, които биха надхвърлили ограниченията на апекс регулатора, ако се обработват нормално. Пакетният клас изпълнява кода асинхронно.
Следват предимствата на пакетния клас:
- Пакетният клас обработва данните на части и ако дадена част не успее да обработи успешно, всички успешно обработени части не се връщат назад.
- Всяка част от данните в партиден клас се обработва с нов набор от ограничения на регулатора, който гарантира, че кодът се изпълнява в рамките на ограниченията за изпълнение на регулатора.
- База данни. Пакетният интерфейс трябва да бъде имплементиран от апекс клас, за да се използва като пакетен клас. Той предоставя три метода, които трябва да бъдат реализирани от партидния клас.
Следват трите метода, предоставени от Database. Пакетиран интерфейс:
1.старт()
Този метод генерира обхвата на записите или обектите, които да бъдат обработени от интерфейсния метод execute. По време на изпълнение на партида, той се извиква само веднъж. Този метод или връща обект Database.QueryLocator или Iterable. Броят на записите, извлечени от SQL заявка с помощта на обекта Database.QueryLocator, е 50 милиона записа, но при използване на итерируем общият брой записи, които могат да бъдат извлечени от SQL заявката, е само 50000 XNUMX. Iterable се използва за генериране на сложен обхват за партиден клас.
Синтаксис на метода за стартиране:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {}
2.изпълни()
Този метод се използва за обработка на всяка част от данните. За всяка част от записите се извиква метод за изпълнение. Размерът на пакета по подразбиране за изпълнение е 200 записа. Методът Execute приема два аргумента:
Препратка към обекта Database.BatchableContext,
Списък от sObjects, като List , или списък с параметризирани типове. Синтаксис на метода за изпълнение:
global void execute(Database.BatchableContext BC, list<P>){}
3.финиш()
Методът за завършване се извиква веднъж по време на изпълнението на партидния клас. Операциите за последваща обработка могат да се извършват в метода на финала. Например: изпращане на имейл за потвърждение. Този метод се извиква, когато цялата партида бъде обработена. Синтаксис на метода Finish:
global void finish(Database.BatchableContext BC){}
Database.BatchableContext обект
Всеки метод от базата данни. Интерфейсът Batchable има препратка към обект Database.BatchableContext.
Този обект се използва за проследяване на напредъка на пакетното задание.
Следват методи за екземпляри, предоставени от BatchableContext:
- getChildJobId(): Този метод връща идентификатора на групова задача, която се обработва в момента.
- getJobId(): Този метод връща идентификатора на партидното задание.
По-долу е синтаксисът на партиден клас:
global class MyBatchClass implements Database.Batchable<sObject> { global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) { // collect the batches of records or objects to be passed to execute } global void execute(Database.BatchableContextbc, List<P> records){ // process each batch of records } global void finish(Database.BatchableContextbc){ // execute any post-processing operations } }
Database.executeBatch метод
Методът Database.executeBatch се използва за изпълнение на пакетен клас.
Този метод приема два параметъра: Екземпляр на груповия клас, който трябва да бъде обработен, Параметър Опции за указване на размера на партидата, ако не е посочен, той приема размера по подразбиране от 200.
Синтаксис на Database.executeBatch:
Database.executeBatch(myBatchObject,scope)
Изпълнение на пакетно име на клас MyBatchClass:
MyBatchClassmyBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject,100);
Database.stateful
Пакетният клас е без състояние по подразбиране. Всеки път, когато се извика методът за изпълнение, се получи ново копие на обект, всички променливи на класа се инициализират.
Database.stateful е внедрен, за да направи партиден клас със състояние.
Ако вашият пакетен клас имплементира База данни , интерфейс със състояние, всички променливи на екземпляра запазват своите стойности, но статичните променливи се нулират между транзакцията.
Oбобщение
- Apex е строго типизиран, обектно-ориентиран програмен език който се компилира и работи на платформа force.com
- Езикът за програмиране Apex е език, който не различава малки и големи букви
- Два типа поток от действия в Apex са 1) Действие на разработчиците 2) Действие на крайния потребител
- Apex ви помага да създавате уеб услуги, които интегрират Salesforce с други приложения.
- Типовете данни, поддържани от apex, са: 1).Primitive 2) Collections 3) sObject, Enums, 4) Classes, 5) Objects and Interfaces
- Публични, частни, защитени и глобални са посочена поддръжка от Apex
- Ключовите думи, използвани в Apex, са: 1) Със споделяне, 2) Без споделяне, 3) Статични, 4) Крайни, 5) Връщане, 6) Нулеви, 7) Виртуални, 8) Абстрактни
- Низът е набор от знаци без ограничения за знаци
- Ограниченията на регулатора на Apex са ограниченията, наложени от двигателя за изпълнение на apex, за да се гарантира, че всеки код и процеси на върха на пистата
- Getter и setter могат да се използват за изпълнение на код преди стойността на свойството да бъде достъпна или променена
- Има три начина за създаване на апекс класове в Salesforce: 1) Конзола за програмисти 2) Force.com IDE и 3) Страница с подробности за класа на Apex.
- Apex тригерите ви позволяват да изпълнявате потребителски apex преди и след извършване на DML операция.
- Пакетният клас в salesforce се използва за обработка на голям брой записи, които биха надхвърлили ограниченията на апекс регулатора, ако се обработват нормално.