Кто-нибудь, пожалуйста, помогите мне. У меня есть код триггера ff apex, и он сталкивается с этой проблемой:

"TriggertoCreateContactformCase в строке 13, столбце 1: слишком много строк запроса: 50001"

Код ApexTriggerCode:

trigger TriggertoCreateContactformCase on Case (before insert) {
    List<String> UseremailAddresses = new List<String>();
    //First exclude any cases where the contact is set
    for (Case c:Trigger.new) {
        if (c.ContactId==null &&
            c.SuppliedEmail!=''|| c.SuppliedEmail==null)
        {
            UseremailAddresses.add(c.SuppliedEmail);
        }
    }

    //Now we have a nice list of all the email addresses.  Let's query on it and see how many contacts already exist.
    List<Contact> listofallContacts = [Select Id,Email From Contact Where Email in:UseremailAddresses];
    Set<String> ExstingEmails = new Set<String>();
    for (Contact c:listofallContacts) {
        ExstingEmails.add(c.Email);
    }

    Map<String,Contact> emailToContactMap = new Map<String,Contact>();
    List<Case> casesToUpdate = new List<Case>();

    for (Case c:Trigger.new) {
        if (c.ContactId==null &&
            c.SuppliedName!=null &&
            c.SuppliedEmail!=null &&
            c.SuppliedName!='' &&
           !c.SuppliedName.contains('@') &&
            c.SuppliedEmail!='' &&
           !ExstingEmails.contains(c.SuppliedEmail))
        {
            //The case was created with a null contact
            String[] Emailheader = c.SuppliedName.split(' ',2);
            String email = c.suppliedEmail;
            String companyName = email.substringBetween('@', '.com');
            System.debug('------------> CompanyName ' + companyName);

            if (Emailheader.size() == 2)
            {
                Contact conts = new Contact(FirstName=Emailheader[0],
                                            LastName=Emailheader[1],
                                            Email=c.SuppliedEmail,  PLDT_Enterprise_Email__c = c.SuppliedEmail,
                                            PLDT_Home_Email__c = c.SuppliedEmail,   Smart_Email__c = c.SuppliedEmail,
                                            PLDT_Home__c = false, PLDT_Enterprise__c = false, Smart__c = false

                                            );
                emailToContactMap.put(c.SuppliedEmail,conts);
                casesToUpdate.add(c);
            }
        }
    }

    List<Contact> newContacts = emailToContactMap.values();
    System.debug('------------> Contacts ' + newContacts);
    insert newContacts;

    for (Case c:casesToUpdate) {
        Contact newContact = emailToContactMap.get(c.SuppliedEmail);

        c.ContactId = newContact.Id;
    }
}

Как оптимизировать. Пожалуйста помогите.

1
highfive 1 Июл 2018 в 10:14
Первое, что я бы сделал, это использовать набор, а не список для хранения этих адресов электронной почты. Таким образом, у вас будут только уникальные.
 – 
user1974566
1 Июл 2018 в 11:18
1
И вы пытаетесь добавить нулевые электронные письма. Вы, вероятно, ошиблись в своем условии c.Suppliedemail == null
 – 
user1974566
1 Июл 2018 в 11:31

1 ответ

Как прокомментировал пользователь1974566, возможно, этот запрос имеет null в списке UseremailAddresses:

[Select Id,Email From Contact Where Email in:UseremailAddresses];

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

Быстрый способ проверить это изменить этот запрос на:

[Select Id,Email From Contact Where Email in:UseremailAddresses and Email != null];

Если это проблема, вы должны исправить ее в своей предыдущей логике.

Также использование String.isNotBlank, которое охватывает как null, так и '', сделает ваш код немного понятнее и с большей вероятностью будет работать:

Set<String> UseremailAddresses = new Set<String>();
for (Case c : Trigger.new) {
    if (c.ContactId == null && String.isNotBlank(c.SuppliedEmail)) {
        UseremailAddresses.add(c.SuppliedEmail);
    }
}
4
Keith C 1 Июл 2018 в 12:00
Большое спасибо за ваш отзыв. Проверит с нашей командой и последует за рекомендацией.
 – 
Chelle Laurice Fuertes
2 Июл 2018 в 06:09