У меня есть следующий код. Поле SAP Matrix__c — это поле поиска. Когда он ссылается на другой объект. Если он находит совпадение, он обновляется до правильного идентификатора, но если он не находит совпадения, он ничего не делает. Если он не находит совпадения, мне нужно обновить поле SAP_Matrix__c в цитате до пустого.

trigger SAPID on FX5__Quote__c (before insert, before update,after insert) {

   for(FX5__Quote__c cm: Trigger.new)
   {

       List<SAP_Matrix__c> tr = [
           SELECT Id, 
               Legal_Entity__c,
               Bill_To_Address__c
           FROM SAP_Matrix__c
           WHERE Bill_To_Address__c = :cm.Bill_To_Address__c 
           AND Legal_Entity__c = :cm.Legal_Entity__c 
       ];

       for(SAP_Matrix__c t : tr){
           if(tr.isEmpty() != null && tr.size()> 0){
               cm.SAP_Matrix__c = t.ID ;
           }
           else {
               cm.SAP_Matrix__c = '';
           }
   }
}
}
0
Martin Lezer 20 Дек 2019 в 11:18
Я также пробовал Null вместо ''
 – 
Anas Adam Sorathia
20 Дек 2019 в 02:22
Добро пожаловать в СФСЭ. Уделите время изменить этот вопрос, чтобы предоставить подробное описание проблемы с этим кодом. Пожалуйста, не оставляйте комментарии для добавления информации.
 – 
David Reed
20 Дек 2019 в 02:27
Поле обязательно? Каково текущее поведение? Вы получаете какие-либо ошибки?
 – 
Brand0R
20 Дек 2019 в 02:27
4
Первая проблема здесь заключается в том, что вы выполняете SOQL в цикле for - это приведет к увеличению ограничений - обратитесь к документации Apex по объему
 – 
cropredy
20 Дек 2019 в 02:30
3
У вас много ненужной логики в ваших операторах if, вам не нужно проверять, если !tr.isEmpty() И если tr.size() больше 0. Фактически это одно и то же. Если вы хотите запустить этот логический блок только тогда, когда tr не пуст, вы можете просто выполнить if(!tr.isEmpty()). Также вы не можете установить для поля поиска строковое значение ''. Это приведет к ошибке «Неверный идентификатор:». Вам нужно использовать cm.SAP_Matrix__C = null;
 – 
Morgan Marchese
20 Дек 2019 в 03:54

1 ответ

SOQL в циклах for — это простой способ выйти за пределы ограничений регулятора, который не соответствует передовой практике. Эта ссылка на Apex Best Practices — хорошее место для начала :)

Чтобы избежать использования SOQL внутри цикла for, я нашел карты с которыми проще всего работать. Решение будет выглядеть примерно так.

// by using just the before triggers we can update the value of SAP_Matrix__c without a need for a DML statement (database commit)
trigger SAPID on FX5__Quote__c (before insert, before update) {
    // getting the trigger values here so we can iterate through them twice
    List<FX5__Quote__c> quotes = Trigger.new;
    // by using a set we here we can make sure there are no duplicates in the array
    Set<String> billToAddresses = new Set<String>();
    Set<String> legalEntities = new Set<String>();
    List<SAP_Matrix__c> matrixItems = new List<SAP_Matrix__c>();
    Map<String, Id> identifierToId = new Map<String, Id>();

    // first we iterate throuth all the quotes to find potential values
    for(FX5__Quote__c cm : quotes) {
        billToAddresses.add(cm.Bill_To_Address__c);
        legalEntities.add(cm.Legal_Entity__c);
    }

    // then we query SAP_Matrix__c using all of the values found above
    List<SAP_Matrix__c> matrixItems = [
        SELECT Id,
            Legal_Entity__c,
            Bill_To_Address__c
        FROM SAP_Matrix__c
        WHERE Bill_To_Address__c IN :billToAddresses AND
            Legal_Entity__c IN :legalEntities 
    ];

    // then we iterate through the matrix items and organise them into a map
    for(SAP_Matrix__c m : matrixItems) {
        // we create an string identifier that combines the values of Bill_To_Address__c and Legal_Entity__c
        String identifier = m.Bill_To_Address__c + m.Legal_Entity__c;
        identifierToId.put(identifier, m.Id);
    }

    for(FX5__Quote__c cm : quotes) {
        // we then rebuild the identifier to retrieve the results
        String identifier = cm.Bill_To_Address__c + cm.Legal_Entity__c;
        // if there is a matching value the Id will be populated
        // if no matching value is found then the field will be empty
        cm.SAP_Matrix__c = identifierToId.get(identifier);
    }
}
1
will-bowditch 20 Дек 2019 в 13:03