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

おすすめ記事一覧

 - Salesforce