質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

Apex

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

Q&A

解決済

1回答

7315閲覧

Apexトリガ 重複チェック

datenyamineko

総合スコア8

Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

Apex

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

0グッド

0クリップ

投稿2017/04/07 00:32

編集2017/04/07 04:44

###前提・実現したいこと

現在、研修でSalesforceを学んでいるのですが、
まず、オブジェクトを登録し、データ保存をする際に重複チェックするために
Apexトリガを使用して重複チェックをしたいのですがそこの処理部分の
コードがわかりません。
(名前と出身地を登録するのですが、片方が一致してるときはエラーをださず、
両方一致しているときのみエラーを出すようにします)

###該当のソースコード
trigger STEP4Trigger on STEP4__c (before insert, before update) {
for(Integer i=0; i<Trigger.new.size(); i++){
STEP4__c st4 = Trigger.new[i];

}

}

ここまでは、前提条件として与えられているのですが、
STEP4__c st4 = Trigger.new[i];のあとの処理コードがわかりません。

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
SalaesforceのApexトリガを使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

取引先オブジェクトでちょっと作ってみました。
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

投稿2017/04/10 06:13

編集2017/04/10 06:16
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問