0

多くの SOQL ステートメントを使用するトリガーに取り組んでいます。このガイドhttp://wiki.developerforce.com/page/Best_Practice:_Avoid_SOQL_Queries_Inside_FOR_Loopsに従ってみましたが、Salesforce の ID がすべてのアイテムに表示される ID とまったく同じではないため、うまくいきません。これが私が意味することです:

(ちなみに、これは親を呼び出す子レコードであるため、親子関係は機能しません)

list<opportunity> listOpportunity = [select id
                                     From opportunity
                                     Where id IN : *Trigger.oldmap.keyset()];*

for(Opportunity opportunity : listOpportunity)
{
     //Do Code here.

}

私が望むのは、このリストに、トリガーされた正しい機会が入力されることだけです。

4

1 に答える 1

3

ここでは SOQL クエリは必要ありません。次のスニペットを使用できます。

// for iterate trough new opportunities
for (Opportunity newOpp: Trigger.new) {
     // do something with new Opps
}
 // for iterate trough old opportunities
 for (Opportunity oldOpp: Trigger.oldMap.values()) { 
     // read old values on update trigger
 }

また、それを組み合わせることができます

 // for iterate trough old opportunities

for (Opportunity newOpp: Trigger.new) {
    if (newOpp.field1 != Trigger.oldMap.get(newOpp.Id).field1) {
        // do something for changed field
    }
}

================================================== ========================

アップデート

@ユーザー1991372

この更新が役立つことを願っています。ループ内の SOQL でこのような問題を解決するための一般的なアプローチの例を次に示します。

// - - - - - - - - - 引き金

Map<Id, List<Account>> accountsByOpp = new Map<Id, List<Account>>();
 List<Account> accounts = [SELECT Oppty
                                 ,name 
                           FROM account 
                           WHERE oppty IN Trigger.newMap.keySet()];
accountsByOpp = splitListByKey(accounts, 'oppty');

for (Opportunity opp: Trigger.old) {
    List<Account> accs = accountsByOpp.get(opp.Id);
    if (accs != null) {
        // do something
    }
}

//------------------- ユーティリティの頂点

class CommonException extends Exception {}

public static Map<Id, List<sObject>> splitListByKey(List<sObject> sourceList, String key) {
    if (sourceList == null) {
        throw new CommonException('ERROR: splitListByKey(sourceList, key) got incorrect first parameter.');
    }
    if (key == null || key == '') {
        throw new CommonException('ERROR: splitListByKey(sourceList, key) got incorrect second parameter.');
    }
    Map<Id,List<sObject>> result = new Map<Id,List<sObject>>();
    List<sObject> tmpObjs;
    for (sObject obj: sourceList) {
        tmpObjs = new List<sObject>();
        if (obj.get(key) != null && result.containsKey((Id)obj.get(key))) {
            tmpObjs = result.get((Id)obj.get(key));
            tmpObjs.add(obj);
            result.put((Id)obj.get(key), tmpObjs);
        } else if (obj.get(key) != null) {
            tmpObjs.add(obj);
            result.put((Id)obj.get(key), tmpObjs);
        }
    }
    return result;
}
于 2013-11-30T18:41:33.123 に答える