取引先オブジェクトでちょっと作ってみました。
Step4→Account
名前→name
住所→BillingAdress
で読み替えてみてください。
また、名前・住所は入力必須であることを前提でコードを書いています。
簡易な動作でしか確かめていないので、間違っていたらすいません。
Apex
1
2trigger AccountAddressTrigger on Account (before insert, before update) {
3
4 Map<String, Account> accountMap = new Map<String, Account>();
5
6 //トリガ内で重複があるかチェック
7 for(Account ac : Trigger.New){
8 if((ac.name!= null && ac.BillingStreet != null )&&
9 (Trigger.isInsert || (ac.name != Trigger.oldMap.get(ac.id).name || ac.BillingStreet != Trigger.oldMap.get(ac.id).BillingStreet))){
10 String keyString = editKey(ac.name, ac.BillingStreet);
11 if(accountMap.containsKey(keyString)){
12 ac.addError('名前と住所が重複しています');
13 accountMap.get(keyString).addError('名前と住所が重複しています');
14 }else{
15 accountMap.put(keyString, ac);
16 }
17 }
18 }
19
20 //既存のレコードの重複チェック
21
22 //検索用の項目を抽出
23 Set<String> accountKeySet = accountMap.keySet();
24 Set<String> nameSet = new Set<String>();
25 Set<String> billingStreetSet = new Set<String>();
26
27 for(String accountKey : accountKeySet ){
28 String[] tmpSplitKey = splitKey(accountKey);
29 nameSet.add(tmpSplitKey[0]);
30 billingStreetSet .add(tmpSplitKey[1]);
31 }
32
33 for(Account selectAc : [SELECT Id, name, BillingStreet FROM Account WHERE name in :nameSet AND billingStreet in :billingStreetSet]){
34
35 System.debug('selectAc =' + selectAc );
36
37 String tempKey = editKey(selectAc.name, selectAc.BillingStreet);
38
39 if(accountMap.containsKey(tempKey)){
40 Account tempAccount = accountMap.get(tempKey);
41 tempAccount.addError('名前と住所が重複しています');
42 }
43 }
44
45 //検索用キー作成
46 private static String editKey(String name, String billingStreet){
47 return name + '@@@' + billingStreet;
48 }
49
50 //検索用キーの分解
51 private static String[] splitKey(String key){
52 return key.split('@@@');
53 }
54}
55
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。