Как создать класс Apex? - PullRequest
       70

Как создать класс Apex?

0 голосов
/ 30 апреля 2018

Путем множества проб и ошибок я создал функционирующий триггер в своей песочнице. Моя проблема в том, что я хотел бы применить его к своей живой организации, но я не могу понять, что такое класс вершин.

Как я могу создать класс?

Идея, лежащая в основе моего триггера, заключается в том, что при сохранении записи о возможности запрос soql проверяет значение списка выбора, выбранного в поле категории, и находит тип активной учетной записи поставщика или участника службы с соответствующим именем и переносит его Salesforce ID. Добавление этого sfid в мое поле поиска имени поставщика позволит мне установить связь между возможностью и учетной записью службы поставщика / участника, которая мне нужна для других правил рабочего процесса и обновлений поля.

    trigger Find_Vendor on Opportunity (before insert)
    {
       for(Opportunity u:trigger.new)
       {
          if(u.Vendor_Name__c == null)
          {
              u.Vendor_Name__c =   [Select Id From Account
                             Where (Account_Type__c = 'Vendor'
                             OR Account_Type__c = 'Member Services')
                             AND Status__c = 'Active'
                             AND Name = :u.Category__c limit 1].Id;
          }
       }
    }

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я бы не стал использовать этот триггер в рабочей среде, у него много проблем, и он, вероятно, сломался бы, потому что вы выполняете запрос SOQL в цикле for, а логика кажется недостаточно продуманной. Видя, что вы не очень разбираетесь в написании триггеров, вам, вероятно, следует взглянуть на декларативное решение, такое как построитель процессов и поток без заголовка , где вы можете достичь того же результата. Если вы настаиваете на использовании триггеров, я бы рекомендовал использовать что-то вроде следующего:

 trigger Find_Vendor on Opportunity (before insert)
{
   Set<String> categories = new Set<String>();
   Map<String, Id> categoryAccountIdMap = new Map<String, Id>();
   for(Opportunity u:trigger.new)
   {
      if(u.Category__c != null)
      {
           categories.add(u.Category__c);
      }
   }
   List<Account> categoryAccounts = [Select Id From Account
                         Where (Account_Type__c = 'Vendor'
                         OR Account_Type__c = 'Member Services')
                         AND Status__c = 'Active'
                         AND Name IN :categories];
   for(Account acct : categoryAccounts){
       if(!categoryAccountIdMap.containsKey(acct.Name)){
            categoryAccountIdMap.put(acct.name, acct.Id);
       }
   }
   for(Opportunity u:trigger.new)
   {
      if(u.Vendor_Name__c == null && categoryAccountIdMap.containsKey(u.Category__c))
      {
          u.Vendor_Name__c =   categoryAccountIdMap.get(u.Category__c);
      }
   }
}

Вам также понадобится какое-то тестовое покрытие вашего триггера, чтобы его можно было отпустить, но достаточно просто вставить возможность в тест

@IsTest
private class SomeTestClassName {

@isTest
static void testOppVendor() {
 //you may need to add required fields to these objects to actually insert  them
    Account a = new Account(Name = 'Category 1');
    insert  a;
    Opportunity o = new Opportunity(Name = 'test', StageName = 'Closed Won', Category__c = 'Category 1');
    insert o;
    o = [SELECT Vendor_Name__c FROM Opportunity where Id = :o.Id];
    System.assertEquals(a.Id, o.Vendor_Name__c);
}

При этом существует ряд не рекомендуемых лучших практик, таких как фабрика тестовых данных и перенос бизнес-логики из триггеров в классы предметной области, с которыми вам непременно следует ознакомиться.

0 голосов
/ 30 апреля 2018

Я хотел бы указать на некоторые проблемы с вашим кодом, прежде чем даже предлагать вам развернуть его для работающей организации.

  1. Вы используете оператор SOQL для цикла. В среде SF вы ограничены 101 запросом SOQL на транзакцию. Когда вы будете массово обновлять свои OPP, а их будет более 101, вы столкнетесь с SOQL LIMIT: слишком много запросов. описание здесь

  2. , чтобы иметь возможность развертывания в производственной организации, вам необходимо иметь тестовое покрытие. Таким образом, чтобы вы могли развернуть этот триггер в рабочей среде, вам необходимо создать тест. основные ресурсы здесь . Не забудьте запустить несколько массовых тестов.

  3. Я бы порекомендовал вам не использовать триггеры для фактического выполнения функций. в вашей организации будет огромное количество триггеров, и вам будет сложно управлять порядком их выполнения. попробуйте принять модель, в которой триггер не содержит никакой логики, кроме случаев, когда это происходит до или после обновления, и так далее. Базовое объяснение можно найти здесь

Отличным ресурсом для получения дополнительной информации о лимитах SF и передовых методах является sfdc99.com .

...