Apex,Visualforce 動的にカスタム項目を取得する
いつも忘れてしまうので書いとく。
参考:sobjectを利用したカスタムオブジェクト項目取得サンプル
やりたいこと
Visualforceページ等では、URLパラメータに連動して、様々なデータの取得を行うことが多いのですが、その際に動的に取得したいデータを変えたいことがあります。それもこれも、過去のデータ構造のせいではあるのですがそこは致し方ないので、それを乗り越えるための実装を考えることになる。(ちなみにその過去の遺産を作ったのも自分であり、十字架を背負って生きている)
例えば、弊社のある項目では、特定期間の売上金額を
2019_01__c
2019_02__c
みたいなカスタム項目にまとめており、これをURLが
/apex/myVisualforcePage?yearmonth=2019_01
の時に取得するようなことを検討することになる。
まずはオブジェクトリストを取得する
ここはそんなに難しくない。
public String getAllFieldNames(String sobjName){
String strFieldKeys='';
Schema.SObjectType sobjType = Schema.getGlobalDescribe().get(sobjName);
Map<String, Schema.SObjectField> fmap = sobjType.getDescribe().fields.getMap();
for (String fieldKey : fmap.keySet()) {
Schema.SObjectField f = fmap.get(fieldKey);
if(strFieldKeys == ''){
strFieldKeys = fieldKey;
}else{
strFieldKeys += ',' + fieldKey;
}
}
return strFieldKeys;
}
こんな感じの関数を用意して、
String soql = 'SELECT ' + getAllFieldNames('Opportunity') + 'FROM Opportunity WHERE 条件';
LIST<Opportunity> opps = new LIST<Opportunity>();
opps = Database.query(soql);
としてやれば取得できる。
この中に以下のような項目があったとして、URLで取得したいのだ。
2019_01__c
2019_02__c
参考:sobjectを利用したカスタムオブジェクト項目取得サンプル
これをするには、オブジェクトを指定したリストでは不可能ぽい。なので
LIST<Opportunity> opps = new LIST<Opportunity>();
としたところを
LIST<sobject>opps = new LIST<sobject>();
としてsObject型でリストを作成する。
こうすると、明示的に型を指定して、項目を取得する必要があるので、2019_01__cを取得する場合は
Integer Int_201901;
for(sObject op : opps){
Int_201901= (Integer)op.get('2019_01__c');
}
という形で取り出せる。
2019_01__cの部分はテキストなので、URLパラメータを取得したものを適当な変数にいれて持ち込んでも良い。