crmprogrammer38の日記

主にDWHやSalesforceのプログラムメモです。

【Salesforce】1度のSOQLで選択リストの値(表示ラベル)とAPI 参照名を取得する。

toLabelで表示ラベルを取得する

例えば次のような選択リスト項目「PickTest__c」があります。

f:id:crmprogrammer38:20170608132834p:plain

 

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);
}

[実行結果]

a
b
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);
}

 [実行結果]

ラベルA
ラベルB
ラベル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)  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のタイミングで作成しました。