Я бы не стал использовать этот триггер в рабочей среде, у него много проблем, и он, вероятно, сломался бы, потому что вы выполняете запрос 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);
}
При этом существует ряд не рекомендуемых лучших практик, таких как фабрика тестовых данных и перенос бизнес-логики из триггеров в классы предметной области, с которыми вам непременно следует ознакомиться.