MENU
Abo
某SIer勤務。
ITエンジニアです。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】文字列連結をキーに参照関係にないレコードを取得してみた

今回は、

レコードの複数の項目の値と等しい値を持つもう1つのオブジェクトのレコードを取得してみます。

一致条件は複数項目の値が等しいものなので、文字列連結が使えそうです。

とりあえず、以下のようなケースで考えてみます。

shipBookオブジェクトにレコードがinsertされた時に、 shipBookオブジェクト の項目、「bookNumber」、「genre」、「author」の3つの値と一致するレコードを stockBookオブジェクトから取得する。

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つの文字列を連結させた値を格納する数式項目をそれぞれ用意するとかですかね。そうすると条件に一致するレコードを簡単に探せそうです。

どっちを使用するかは時と場合によりますかね。

とりあえず今回はコードのみで完結です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
Salesforceエンジニアです。
日々の学びをつらつらと書いています。
Certified Administrator
Certified Platform DeveloperⅠ
Certified Platform DeveloperⅡ
Certified Sales Cloud Consultant

コメント

コメントする

CAPTCHA


目次