こんにちは、管理人の@Salesforce.Zです。
Method does not exist or incorrect signature: void getRecordTypeInfosByDeveloperName() from the type Schema.DescribeSObjectResult
レコードタイプのIDを取得したくて、なぜなら
Salesforceトリガを実装する時にRecordTypeIdは直接アクセスできるが
RecordType.DevelopedNameは直接アクセスできない
レコードタイプ別に処理を行う時に、レコードタイプを知る必要があります。
では、トリガでクエリを発行する?消費してしまうですね
そこで、DescribeSObjectResult クラスが登場する
目次
レコードタイプ
環境による、レコードタイプIDが変わる
トリガを実装する場合、クエリを発行しない限り
レコードタイプIDしか分からないはずです。
では、IDをハードコーディングして判別できるが、環境が変わると IDも変わるので、コードを修正する必要がある。
そこで、今回、発想できたのが
レコードタイプの開発名を使い、レコードタイプのIDを取得する
取得したレコードタイプのIDとトリガのsObject.RecortTypeIdを比較し
判別する考えです。
レコードタイプの開発名は変わらない
レコードタイプの開発名はテスト環境も本番環境も同じです。
この変わらない開発名を使い、随時にレコードタイプのIDを取得することが可能です。そしてクエリを消費しません。
方法としてはDescribeSObjectResult クラスのgetRecordTypeInfosByDeveloperName()メソッドです。
例えば、取引先に営業と開発のレコードタイプがあります。
# | レコードタイプの表示ラベル | レコードタイプ名(開発名) | レコードタイプID |
---|---|---|---|
1 | 営業 | SalesRecordType | 環境によって異なる |
2 | 開発 | DevRecordType | 環境によって異なる |
このレコードタイプの開発名が変わらない点とDescribeSObjectResult クラスのgetRecordTypeInfosByDeveloperName()メソッドでトリガ内で、簡単にクエリを消費せずにレコードタイプのIDを取れる
サンプルコード
String salesRecrodTypeId = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('レコードタイプの開発名').getRecordTypeId(); if(Trigger.New[0].RecordTypeId == salesRecrodTypeId){ // 営業レコードタイプの場合の処理等 }
メソッド使えない
エラー:Schema getRecordTypeInfosByDeveloperName() method does not exists.
これが単純にクラスのバージョン問題です。
クラスのバージョンを43以上にしてください。
それで、使えるようになります。
クラスの一覧で対象のクラスを編集モードにすれば、下記の設定が可能です。
変更場所はSalesforce APIのバージョンです。