function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ruparuparuparupa 

リストにSOQLで取得した値を設定するときにエラーになってしまう

お世話になっております。

下記のトリガで、ケースにデータローダで複数データを作成したとき、
18行目のリストにSOQLで取得した値を設定する箇所で
「System.QueryException: List has more than 1 row for assignment to SObject」というエラーになってしまいます。
ケースを1件のみ作成だとエラーにはなりません。
上記エラーはリストに格納すれば問題ない認識だったのですが、どこか問題がありますでしょうか。

よろしくお願いいたします。
 
trigger caseTrigger on Case (before insert) {
    if(Trigger.isInsert && Trigger.isBefore){
      
      /***** 変数宣言 *****/
      Map<Integer, Case> iCaseMap    = new Map<Integer, Case>(); // ケースのMap
      List<Account> accList = new List<Account>();  // 取引先リスト
      Integer i = 1;

      /***** ケースのMapを作成 *****/
      for(Case c : Trigger.new){
        iCaseMap.put(i, c);
        i++;
      }
      
      if(!iCaseMap.isEmpty()){

          /***** 取引先リストを作成 *****/
          accList = [SELECT Id, Name FROM Account
                            WHERE Name=:iCaseMap.values().Type
                            ORDER BY Phone ASC LIMIT 1];
          System.debug('★accList:'+accList);
      }                      
    }
}

 
Best Answer chosen by ruparupa
Taiki YoshikawaTaiki Yoshikawa
おそらくWHEREの部分が原因ですね。Mapの複数の値を判定に使用する場合は = ではなく、INを使用します。
また、複数のsObject型を上記のようには判定で使用できないため、一度Set型なのに入れてあげる必要があります。
 
// sObject型の項目を条件に使用したい場合は、Setに値をいれます。
Set<String> caseTypes = new Set<String>();
for (Case c : Trigger.new) {
    caseTypes.add(c.Type);
}

// Setの値をつかってクエリを実行します。
accList = [SELECT Id, Name FROM Account 
                    WHERE Name IN: caseTypes ORDER BY Phone ASC LIMIT 1];

こんな感じでクエリを実行できると思います。

All Answers

Taiki YoshikawaTaiki Yoshikawa
おそらくWHEREの部分が原因ですね。Mapの複数の値を判定に使用する場合は = ではなく、INを使用します。
また、複数のsObject型を上記のようには判定で使用できないため、一度Set型なのに入れてあげる必要があります。
 
// sObject型の項目を条件に使用したい場合は、Setに値をいれます。
Set<String> caseTypes = new Set<String>();
for (Case c : Trigger.new) {
    caseTypes.add(c.Type);
}

// Setの値をつかってクエリを実行します。
accList = [SELECT Id, Name FROM Account 
                    WHERE Name IN: caseTypes ORDER BY Phone ASC LIMIT 1];

こんな感じでクエリを実行できると思います。
This was selected as the best answer
Taiki YoshikawaTaiki Yoshikawa
あ、、上の書き方の場合はLIMIT 1は不要ですね。
ruparuparuparupa
Taiki Yoshikawaさん

ご回答ありがとうございます。
オブジェクト型使えないのですね。
ありがとうございました。