質問: ### 前提・実現したいこと 現在、研修でSalesforceを学んでいるのですが、 まず、オブジェクトを登録し、データ保存をする際に重複チェックするために Apexトリガを使用して重複チェックをしたいのですがそこの処理部分の コードがわかりません。 (名前と出身地を登録するのですが、片方が一致してるときはエラーをださず、 両方一致しているときのみエラーを出すようにします) ### 該当のソースコード trigger STEP4Trigger on STEP4*c (before insert, before update) { for(Integer i=0; i
回答: 取引先オブジェクトでちょっと作ってみました。 Step4→Account 名前→name 住所→BillingAdress で読み替えてみてください。 また、名前・住所は入力必須であることを前提でコードを書いています。 簡易な動作でしか確かめていないので、間違っていたらすいません。 ``` trigger AccountAddressTrigger on Account (before insert, before update) { Map accountMap = new Map(); //トリガ内で重複があるかチェック for(Account ac : Trigger.New){ if((ac.name!= null && ac.BillingStreet != null )&& (Trigger.isInsert || (ac.name != Trigger.oldMap.get(ac.id).name || ac.BillingStreet != Trigger.oldMap.get(ac.id).BillingStreet))){ String keyString = editKey(ac.name, ac.BillingStreet); if(accountMap.containsKey(keyString)){ ac.addError('名前と住所が重複しています'); accountMap.get(keyString).addError('名前と住所が重複しています'); }else{ accountMap.put(keyString, ac); } } } //既存のレコードの重複チェック //検索用の項目を抽出 Set accountKeySet = accountMap.keySet(); Set nameSet = new Set(); Set billingStreetSet = new Set(); for(String accountKey : accountKeySet ){ String[] tmpSplitKey = splitKey(accountKey); nameSet.add(tmpSplitKey[0]); billingStreetSet .add(tmpSplitKey[1]); } for(Account selectAc : [SELECT Id, name, BillingStreet FROM Account WHERE name in :nameSet AND billingStreet in :billingStreetSet]){ System.debug('selectAc =' + selectAc ); String tempKey = editKey(selectAc.name, selectAc.BillingStreet); if(accountMap.containsKey(tempKey)){ Account tempAccount = accountMap.get(tempKey); tempAccount.addError('名前と住所が重複しています'); } } //検索用キー作成 private static String editKey(String name, String billingStreet){ return name + '@@@' + billingStreet; } //検索用キーの分解 private static String[] splitKey(String key){ return key.split('@@@'); } } ```