toLabelで表示ラベルを取得する
例えば次のような選択リスト項目「PickTest__c」があります。
1) 項目をselectした場合
選択リスト項目は、オブジェクトには、API 参照名がセットされていて、Apexコードと実行結果は次の通りです。
[Apex]
List<Sample__c> rows = [Select PickTest__c From Sample__c];
for(Sample__c row : rows){
System.debug(row.PickTest__c);
}
[実行結果]
2) tolabelを使用した場合
tolabel関数で表示ラベルとなります。(翻訳が指定されている場合は、翻訳後の値となり、翻訳が指定されていなければ、値になります)ここでの注意したいのが、SOQLでtolabel関数を使用しても、Apexコード上は項目名をそのまま使用するという点です。
[Apex]
List<Sample__c> rows = [Select tolabel(PickTest__c) From Sample__c];
for(Sample__c row : rows){
System.debug(row.PickTest__c);
}
[実行結果]
3) 項目の値と、tolabel後の表示ラベルを両方取得する。
tolabelを使って、表示ラベルを取得しつつ、項目の値も取得するには、tolabelの項目に別名をつけます。(つけないとエラーになります)別名を取得する際には、SObject.getで取得します。
[Apex]
List<Sample__c> rows = [Select PickTest__c, tolabel(PickTest__c) label_pick From Sample__c];
for(Sample__c row : rows){
System.debug('項目の値: ' + row.PickTest__c + ' 表示ラベル:' + row.get('label_pick'));
}
[実行結果]
項目の値: a 表示ラベル:ラベルA |
項目の値: b 表示ラベル:ラベルB |
項目の値: c 表示ラベル:ラベルC |
その他) 参照先の項目にtolabelを指定する時は別名はつけられないようです。(エラーとなりました)
次のSOQLはエラー
List<SampleSub__c> rows = [Select tolabel(Parent__r.PickTest__c) alias_pick From SampleSub__c];
次のSOQLはエラーとならない
List<SampleSub__c> rows = [Select tolabel(Parent__r.PickTest__c) From SampleSub__c];
そして、親オブジェクトから子オブジェクトのサブクエリでは、tolabelを指定した項目に別名をつけなければ結果が返ってきます。が、別名をつけると、結果が返却されません。
[Apex]
//サブクエリで、別名はつけない
List<Sample__c> rows = [Select id , (select id , tolabel(PickSub__c) from SampleSub__r ) from Sample__c];
for(Sample__c row : rows ){
List<SampleSub__c> subrows = row.SampleSub__r;
for(SampleSub__c subrow : subrows ){
System.debug( subrow.getPopulatedFieldsAsMap()); //何が返却されているか
}
}
[実行結果] 結果にtolabel後の項目が含まれる
{Id=a0J0H00000gdbdzUAA, Parent__c=a04i0000010nS6NAAU, PickSub__c=ラベルsubc} |
{Id=a0J0H00000gdbe4UAA, Parent__c=a04i0000010nS6OAAU, PickSub__c=ラベルsubb} |
{Id=a0J0H00000gdZrOUAU, Parent__c=a04i0000010nS6PAAU, PickSub__c=ラベルsuba} |
//サブクエリで、別名をつける
List<Sample__c> rows = [Select id , (select id , tolabel(PickSub__c) alias_pick from SampleSub__r ) from Sample__c];
for(Sample__c row : rows ){
List<SampleSub__c> subrows = row.SampleSub__r;
for(SampleSub__c subrow : subrows ){
System.debug( subrow.getPopulatedFieldsAsMap()); //何が返却されているか
}
}
[実行結果] 結果にtolabel後の項目自体がない
{Id=a0J0H00000gdbdzUAA, Parent__c=a04i0000010nS6NAAU} |
{Id=a0J0H00000gdbe4UAA, Parent__c=a04i0000010nS6OAAU} |
{Id=a0J0H00000gdZrOUAU, Parent__c=a04i0000010nS6PAAU} |
※この記事は、APIVer39のタイミングで作成しました。