Мне нужна помощь в выводе SOQL из цикла for. Я знаю, что мне, вероятно, нужно сопоставить данные. Но как бы я это сделал и добился бы того же результата, я не совсем уверен. Я знаю, что ответ, вероятно, довольно прост, поскольку это не сложный блок кода, но я не знаком с APEX и этим типом синтаксиса, поэтому любая помощь будет принята с благодарностью. Спасибо.

trigger Add_Event_ID on Hum_data__c (before insert) {

    for (Hum_data__c h : Trigger.new) {
    
        String callEventID;
        callEventID = 
            [SELECT call__Event_ID__c 
            FROM call__Call_Detail__c 
            WHERE call__Call_Detail__c.call__Callid__c = :h.call__callid__c 
            LIMIT 1].call__Event_ID__c;
        
        h.call__Event_ID__c = callEventID;
    }
3
Ralph 11 Июл 2020 в 01:15

3 ответа

Попробуйте этот код, здесь я предполагаю, что call__Callid__c - это поле поиска

trigger Add_Event_ID on Hum_data__c (before insert) {
    
    List<Id> callIdList = new List<Id>();
    for (Hum_data__c h : Trigger.new) {
        callIdList.add(h.call__callid__c);
    }
    
    Map<Id,Id> IdMap = new Map<Id,Id>();
    for(call__Call_Detail__c cc : [SELECT call__Event_ID__c,call__Callid__c 
            FROM call__Call_Detail__c 
            WHERE call__Callid__c IN :callIdList] ){
                IdMap.put(cc.call__Callid__c,cc.call__Event_ID__c);
        
    }
    
    for (Hum_data__c h : Trigger.new) {
        h.call__Event_ID__c = IdMap.get(h.call__callid__c);
    }
       
    }
2
salesforce Developer 11 Июл 2020 в 01:33

Вот пример с комментариями того, как этот код можно реструктурировать с помощью карты, чтобы связать значения идентификаторов друг с другом.

Кроме того, не используйте String для значений Id. Безопаснее использовать правильный тип данных, когда это возможно.

trigger Add_Event_ID on Hum_data__c(before insert) {
    // a place to store our results
    Map<Id, Id> callIdToEventIdMap = new Map<Id, Id>();

    // gather all of the call ids
    for (Hum_data__c h : Trigger.new) {
        callIdToCallDetailMap.put(h.call__callid__c, null);
    }

    // make the query
    for (call__Call_Detail__c detailRecord : [
        SELECT call__Event_ID__c
        FROM call__Call_Detail__c
        WHERE call__Callid__c IN :callIdToEventIdMap.keyset()
    ]) {
        // match the call id with the event id. this will also push out any duplicates
        callIdToEventIdMap.put(detailRecord.call__Callid__c, detailRecord.call__Event_ID__c);
    }

    // put the event id value from the map into the field on the trigger record
    for (Hum_data__c h : Trigger.new) {
        h.call__Event_ID__c = callIdToEventIdMap.get(h.call__callid__c);
    }
}
2
Mark Pond 11 Июл 2020 в 01:48

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

  1. Запускайте запрос только при необходимости
  2. Выполняйте назначение только тогда, когда существуют справочные данные

Обычно картина такая:

  1. Создайте коллекцию карт для фильтрации запроса и сохранения соответствующего результата запроса.
  2. Повторите список триггеров и выполните назначение на основе ключа карты (из шага № 1)
trigger Add_Event_ID on Hum_data__c (before insert) {

    // Step 1

    // build the collection
    Map<Id, Id> eventIdBycallId = new Map<Id, Id>();
    for (Hum_data__c h : Trigger.new) {
        eventIdBycallId.put(h.call__callid__c, null);
    }
    // important! Only run SOQL query when the Map is not empty
    if (!eventIdBycallId.isEmpty()) {
        for (call__Call_Detail__c ccd : [
                SELECT call__Callid__c, call__Event_ID__c 
                FROM call__Call_Detail__c 
                WHERE call__Callid__c = :eventIdBycallId.keySet()
            ]) {
            eventIdBycallId.put(ccd.call__callid__c, ccd.call__Event_ID__c);
        }
    }
    
    // Step 2 

    for (Hum_data__c h : Trigger.new) {
        // important to check if your map has the corresponding key 
        // to prevent NullPointerException
        if (eventIdBycallId.containsKey(h.call__callid__c)) {
            h.call__Event_ID__c = eventIdBycallId.get(h.call__callid__c);
        }
        // ...
        // other lines of code
    }
}
0
Hengky Djapar 11 Июл 2020 в 03:42