今回は、
「レコードの複数の項目の値と等しい値を持つもう1つのオブジェクトのレコードを取得」してみます。
一致条件は複数項目の値が等しいものなので、文字列連結が使えそうです。
とりあえず、以下のようなケースで考えてみます。
shipBookオブジェクト | stockBookオブジェクト |
---|---|
bookNumber (テキスト) | bookNumber (テキスト) |
genre (テキスト) | genre (テキスト) |
author (テキスト) | author (テキスト) |
やり方はいろいろあるとは思うんですが、今回は3つの項目を文字列連結させてキーにすることにしました。
Set<String> strKeySet = new Set<String>();//3つの項目の文字列連結のSet
Set<String> bookNumberSet = new Set<String>();//bookNumberのSet
Set<String> genreSet = new Set<String>();//genreのSet
Set<String> authorSet = new Set<String>();//authorのSet
for(shipBook__c shb : trigger.new){
//trigger.newからSetを作成
strKeySet.add(shb.bookNumber + '-' + shb.genre + '-' + shb.author );
bookNumberSet.add(shb.bookNumber);
genreSet.add(shb.genre);
authorSet.add(shb.author);
}
//shipBook__cの3つの項目に一致するstockBook__cのレコードを格納するリスト
List<stockBook__c> targetList = new List<stockBook__c>)();
//上で作成したSetを条件にまずは大雑把にstockBookレコードを取得
for(stockBook__c stb : [Select Id bookNumber__c, genre__c, author__c From stockBook__c Where bookNumber__c IN: bookNumberSet And genre__c IN: genreSet And author__c IN: authorSet]){
String stKey = stb.bookNumber + '-' + stb.genre + '-' + stb.author;//3つの項目の文字列連結を作成
if(strKeySet.contains(stKey)){
//作成した文字列連結が、trigger.newから作成したstrKeySetに含まれていれば、
//今、回しているレコードは対象のレコードということ
targetList.add(stb);
}
}
3つの項目のそれぞれのSetを作成しておき、それらを条件にまずは大雑把にstockBookオブジェクトからレコードを取得します。(18行目)
この時点では、 3つの値と一致するレコードを正確に抽出できていない状態ですね。
20行目のif文の部分で、最初に作成しておいた3つの項目を文字列連結のSetを使用して対象のレコードを絞り込んでいます。
別の方法としては、2つのオブジェクトに3つの文字列を連結させた値を格納する数式項目をそれぞれ用意するとかですかね。そうすると条件に一致するレコードを簡単に探せそうです。
どっちを使用するかは時と場合によりますかね。
とりあえず今回はコードのみで完結です。
コメント