【Salesforce】レコードタイプのレコードタイプ名について
SalesforceのSObjectには、レコードタイプという参照項目があります。
SObjectのレコードがどんなレコードかを表すために使用するもので、ページレイアウトを切り替えるために使う人も多いのではないでしょうか。
レコードタイプを作成する際には「レコードタイプ名」を設定しますね。
「レコードタイプ名」は一意の名前で設定する必要があるのですが、別のオブジェクトであれば同じ値を設定することが出来ます。
ここまでが前置きです。
Apexコードでレコードタイプを取得するMapを作成した際に、このようなレコードを書きました。
/** * レコードタイプを取得するためのMapを作成する * Map<レコードタイプ名, レコードタイプ> * @return API名からレコードタイプを取得するMap */ private Map<String, RecordType> createRecordTypeMap(){ Map<String, RecordType> recordTypeMap; List<RecordType> recordTypeList; // レコードタイプを取得する recordTypeList = [select Id, DeveloperName from RecordType]; // レコードタイプを取得するMapを作成する recordTypeMap = new Map<String, RecordType>(); for(RecordType recType : recordTypeList){ // Mapにレコードタイプを設定する recordTypeMap.put(recType.DeveloperName, recType); } return recordTypeMap; }
パッと見はごく普通にMapを作成しているプログラムです。
しかし、このまま使用すると困ったことが起きてしまいますね。
前置きの時点で分かった人も多いかと思います。
例えば、取引先と取引先責任者に同名のレコードタイプが存在した場合、どちらのレコードタイプが取得されるのかが分かりません。
結果、取引先責任者のレコードタイプを取引先のレコードタイプに設定してエラーが発生する、ということがあります。
そこで、修正版のプログラムです。
/** * レコードタイプを取得するためのMapを作成する * Map<レコードタイプ名, レコードタイプ> * @return API名からレコードタイプを取得するMap */ private Map<String, RecordType> createRecordTypeMap(){ Map<String, RecordType> recordTypeMap; List<RecordType> recordTypeList; // レコードタイプを取得する recordTypeList = [select Id, DeveloperName, SObjectType from RecordType where SObjectType = 'Account']; // レコードタイプを取得するMapを作成する recordTypeMap = new Map<String, RecordType>(); for(RecordType recType : recordTypeList){ // Mapにレコードタイプを設定する recordTypeMap.put(recType.DeveloperName, recType); } return recordTypeMap; }
レコードタイプを取得する際に、SObjectの型を指定しました。
こうすることにより、Mapのキーで重複はなくなりますね。
もしくは、Mapの中にMapを作成することで解決することも出来ます。
/** * レコードタイプを取得するためのMapを作成する * Map<SObjectType, Map<DeveleperName, RecordType>> * @return API名からレコードタイプを取得するMap */ private Map<String, RecordType> createRecordTypeMap(){ List<RecordType> recordTypeList; Map<String, Map<String, RecordType>> recTypeMap; // レコードタイプのリストを取得する recordTypeList = [select Id, DeveloperName, SObjectType from RecordType]; // レコードタイプ取得用Mapを作成する recTypeMap = new Map<String, Map<String, RecordType>>(); for(RecordType recordType : recordTypeList){ String sObjectType; String developerName; Map<String, RecordType> tmpMap; // SObject名を取得する sObjectType = recordType.SObjectType; // DeveloperNameを取得する developerName = recordType.DeveloperName; // Mapにキーが存在しない場合、追加する if(!recTypeMap.containsKey(SObjectType)){ recTypeMap.put(SObjectType, new Map<String, RecordType>()); } // SObjectごとのMapを取得する tmpMap = recTypeMap.get(sObjectType); // Mapに値追加する tmpMap.put(developerName, recordType); } return recTypeMap; }
こちらはSObjectType別にMapを作成するバージョンです。
こうすることによって、複数のSObjectに対するレコードタイプを取得することができます。
個人的にはこちらの方が好きです。
レコードタイプの取得についてはSOQLを使用せずにSchemaから取得することも多いですね。
どちらでも良いと思いますが、何となく分かりやすいので私はSOQLから取得するようにしています。
どちらの方が良いのでしょうね。
No comments.