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パラメータを取得したものを適当な変数にいれて持ち込んでも良い。