【Salesforce】カスタム設定の使い方
私は下っ端なので、あまりデータベースの設計をすることがありません。
大体は上の人が作っており、たまに参考程度に意見を求められるくらいです。
Salesforceにはカスタムオブジェクトを作成することが出来ますが、それとは別にカスタム設定というものがありますね。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_customsettings.htm
よく見るカスタム設定は大体リスト形式なので、個人的にはカスタムオブジェクトと同じようなものと考えていました。
上のUELでも冒頭に「カスタム設定はカスタムオブジェクトと類似しており」と書いてありますから、その通りなのだと思います。
しかし、少し調べるとカスタムオブジェクトには出来ず、カスタム設定には出来ることがあるようです。
その中で一番大きなものは、SOQLを使用しなくてもアクセスが可能、ということではないでしょうか。
Apexではカスタム設定用のオブジェクトを使用することで、SOQLを使用せずにカスタム設定の値を取得することができます。
まずは、リスト形式のカスタム設定です。
リスト形式のカスタム設定は、カスタムオブジェクトのようにレコードを作成していきます。

リスト形式のカスタム設定は、カスタム設定のメソッドを使用することでレコードを取得することが出来ます。
Map<String, ListSetting__c> listSettingMap;
// リスト形式のカスタム設定をすべて取得する
listSettingMap = ListSetting__c.getAll();
for(String settingName : listSettingMap.keySet()){
ListSetting__c listSetting;
// カスタム設定を取得する
listSetting = listSettingMap.get(settingName);
system.debug('【ログ】' + settingName + ' : ' + listSetting);
}
デバッグログはこんな感じでした。
Map形式で返却され、Keyからカスタム設定が取得できることが分かるかと思います。
【ログ】リスト003 : Name=リスト003, Text01__c=さささささ, Text02__c=ししししし, Text03__c=すすすすす... 【ログ】リスト001 : Name=リスト001, Text01__c=あああああ, Text02__c=いいいいい, Text03__c=ううううう... 【ログ】リスト002 : Name=リスト002, Text01__c=かかかかか, Text02__c=ききききき, Text03__c=くくくくく...
リスト形式なので、SOQLでもレコードを取得することが出来ます。
List<ListSetting__c> listSettingList;
listSettingList = [select Id, Name from ListSetting__c];
for(ListSetting__c listSetting : listSettingList){
system.debug('【ログ】' + listSetting.Name + ':' + listSetting);
}
リスト形式のカスタム設定では、Name項目が一意の値となっています。
そのため、getValuesメソッドでName項目を指定することで、指定したNameのレコードを取得することができます。
ListSetting__c listSetting1;
ListSetting__c listSetting2;
ListSetting__c listSetting3;
// 指定したカスタム設定を取得する
listSetting1 = ListSetting__c.getValues('リスト001');
// 指定したカスタム設定を取得する
listSetting2 = ListSetting__c.getValues('リスト002');
// 指定したカスタム設定を取得する
listSetting3 = ListSetting__c.getValues('リスト003');
system.debug('【ログ】' + listSetting1.Name + ' : ' + listSetting1);
system.debug('【ログ】' + listSetting2.Name + ' : ' + listSetting2);
system.debug('【ログ】' + listSetting3.Name + ' : ' + listSetting3);
こちらのデバッグログはこんな感じです。
【ログ】リスト001 : ListSetting__c:{Name=リスト001, Text01__c=あああああ, Text02__c=いいいいい, Text03__c=ううううう...
【ログ】リスト002 : ListSetting__c:{Name=リスト002, Text01__c=かかかかか, Text02__c=ききききき, Text03__c=くくくくく...
【ログ】リスト003 : ListSetting__c:{Name=リスト003, Text01__c=さささささ, Text02__c=ししししし, Text03__c=すすすすす...
指定したカスタム設定がちゃんと取得されています。
長いので順番を変えて省略していますが、すべての項目が取得されているようです。
次に、階層形式のカスタム設定です。
階層形式のカスタム設定では、組織、プロファイル、ユーザに対してレコードを設定することが出来ます。
階層となっているのですが、組織、プロファイル、ユーザの順に深くなっていくということでしょうか。
こちらもSOQLを使用することなく値を取得することが出来ます。
HierarchySetting__c hierarchySetting;
HierarchySetting__c orgSetting;
HierarchySetting__c profileSetting;
HierarchySetting__c userSetting;
// 組織レベルのカスタム設定を取得する
orgSetting = HierarchySetting__c.getOrgDefaults();
// プロファイルレベルのカスタム設定を取得する
profileSetting = HierarchySetting__c.getValues(UserInfo.getProfileId());
// ユーザレベルのカスタム設定を取得する
userSetting = HierarchySetting__c.getValues(UserInfo.getUserId());
// 指定せずにカスタム設定を取得する
hierarchySetting = HierarchySetting__c.getInstance();
system.debug('【ログ】orgSetting:' + orgSetting);
system.debug('【ログ】profileSetting:' + profileSetting);
system.debug('【ログ】userSetting:' + userSetting);
system.debug('【ログ】hierarchySetting:' + hierarchySetting);
デバッグログはこのようになっています。
値は取得できているのですが、長いので順番を入れ替えて省略しています。
【ログ】orgSetting:HierarchySetting__c:{Name=a0K0V00000hYMn2, Text01__c=あああああ, Text02__c=いいいいい, Text03__c=ううううう...
【ログ】profileSetting:HierarchySetting__c:{Name=階層形式のカスタム設定 (プロファイル), Text01__c=さささささ, Text02__c=ししししし, Text03__c=すすすすす...
【ログ】userSetting:HierarchySetting__c:{Name=階層形式のカスタム設定 (ユーザ), Text01__c=かかかかか, Text02__c=ききききき, Text03__c=くくくくく...
【ログ】hierarchySetting:HierarchySetting__c:{Name=階層形式のカスタム設定 (ユーザ), Text01__c=かかかかか, Text02__c=ききききき, Text03__c=くくくくく...
組織やプロファイルを指定した場合、それぞれの値が取得されていることが分かります。
指定せずに取得したカスタム設定には、ユーザ指定のものと同じものが入っていることが分かります。
メソッドの説明を読むと最下位レベルの設定が取得できると記述されています。
今回の場合は組織、プロファイル、ユーザのすべてに定義があるため、最下位レベルのユーザ指定のカスタム設定が取得されたということでしょう。
階層形式のカスタム設定は、数式で値を使用することが出来ます。

その場合は参照しているログインユーザによって値が変わってしまうようです。
値を固定したい場合は、数式ではなくテキスト項目や数値項目で、初期値として設定するのが良いでしょうか。

どちらのカスタム設定についても、アプリケーションキャッシュを使用しているため高速にアクセスすることが出来ます。
そのうえ、SOQLを使用しなくともレコードを取得できるのですから、うまく使えば大変便利なものです。
用途によって、カスタムオブジェクトを使うかカスタム設定を使うかをよく考えて設計したいですね。



No comments.