Salesforce Trigger - PullRequest
       136

Salesforce Trigger

0 голосов
/ 16 января 2020

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

trigger VerifyAcc on Account (after update) {

Id recordTypeId = [Select Id From RecordType Where DeveloperName = 'newmember'].Id;

    if (recordTypeID =='newmember'){

MAP<Id,List<NewMember__c>>Mapnewmemberstoaccounts new MAP<Id,List<NewMember__c>>();
    for(NewMember__c objNewMember:[select Id,name from NewMember__c where
                           Name IN:Trigger.newmap.keyset()])


    {
        if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null) 
        {

        CalloutException e = new CalloutException();
        e.setMessage('There is no account for this member.');
        throw e;



        }

    }        
    } else{
       CalloutException e = new CalloutException();
        e.setMessage('Couldnt Find anything.');
        throw e;


    } 
}

Ваша помощь высоко ценится.

1 Ответ

1 голос
/ 17 января 2020
trigger VerifyAcc on Account (after update) {

Id recordTypeId = [Select Id From RecordType Where DeveloperName = 'newmember'].Id;

    if (recordTypeID =='newmember'){

Идентификатор типа записи никогда не будет равен тексту "newmember". Вы, вероятно, имеете в виду перебирать Trigger.new и проверять записи, чей Id типа записи соответствует этому.

MAP<Id,List<NewMember__c>>Mapnewmemberstoaccounts new MAP<Id,List<NewMember__c>>();
    for(NewMember__c objNewMember:[select Id,name from NewMember__c where
                           Name IN:Trigger.newmap.keyset()])

Trigger.newMap.keySet() - это Set<Id>. Если поле «Имя» объекта NewMember__c не содержит идентификатора учетной записи, этот запрос не вернет никаких данных.

    {
        if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null) 

Вы никогда не заполните переменную Mapnewmemberstoaccounts, поэтому проверка ее здесь ничего не даст. Метод containsKey() возвращает логическое значение. Он никогда не вернет значение null.

        {

        CalloutException e = new CalloutException();
        e.setMessage('There is no account for this member.');
        throw e;

Ваш код не должен выдавать CalloutException для ошибки, которая не имеет ничего общего с выноской. Если вы хотите sh, чтобы остановить фиксацию определенной записи c в базе данных, используйте метод addError() только для этой записи. Бросок исключения приведет к откату всей транзакции.

        }

    }        
    } else{
       CalloutException e = new CalloutException();
        e.setMessage('Couldnt Find anything.');
        throw e;

Обе ветви этого оператора if закодированы для выброса исключения. Это не имеет смысла; В результате (если включается for l oop когда-либо выполнено) вы не сможете вставить какие-либо учетные записи, потому что ваш триггер всегда выдает исключение.

В грубом плане ваш триггер должен следовать по логическому пути, как это:

Create a collection variable
for each Account in the trigger set:
    if the Account's record type is "New Member":
        Add the Account's identifier to the set.

Query New Member records matching the Account identifiers.
Build a Map between Identifiers and New Member records.

for each Account in the trigger set:
    if the Account's record type is "New Member":
        Check if the Account's Identifier is in the New Member collection
        If it is, call addError() for this Account
...