logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« Apex正規表現はJavaと"大体"同じだよ | トップページ | ApexのメソッドにSOAPでアクセスしてみるテスト »

Force.comのDBでselect * from が出来ないか

Force.comのDBをsoqlで読んだ場合、selectの後に指定したフィールド以外の得られたオブジェクトのフィールドにアクセスしようとすると、以下のエラーで落ちます。

SObject row was retrieved via SOQL without querying the requested field

Force.com研修でもこのエラーについては説明していますが、このエラー、何度見ただろうか。
ようは、文字通り、このオブジェクトは元々、そのフィールドをリクエストしていないsoqlで読まれたものだ、と言っている。

ならば、select * ですべてのフィールドを読みたくなるが、Force.comのsoqlではselect * がサポートされていない。
HibernateのようなORマッピングに慣れていると、読まれたオブジェクトはすべてのフィールドが準備万端なのが当然のように思ってしまうが、クラウドのフレームワークは節約志向に出来ているので、そうは行かないということらしい。

仕方が無いので、地道に必要なフィールドを

select id,Name,xxx__c,yyy__c ・・

てな感じで、記述することになる。
しかし、この問題は、実は非常に厄介で、カスタム項目を追加した場合に、表示するVisualforceページだけでなく、いちいちapexコードにも手を入れなければならない事態になる危険性を秘めているのです。

特定の運用環境のみ、カスタム項目を追加したい場合など、カスタム項目の追加や、Visualforceページの修正は比較的容易だが、apexコードの修正が必要となったとたんに、大事になるので、頭が痛いところ。

そこで、カスタム項目をメタデータから動的に読み取ってsoqlを組み立てるサービスメソッドを作ることにしました。

[Apexコード]
        //SOQL発行用にSObjectのカスタムフィールドのカンマ区切りのリストを作る
        public static String getCustomFieldsNames(Schema.SObjecttype tp){
                String res = '';
                Map<String,Schema.sObjectField> fmap = tp.getDescribe().fields.getMap();
                for(String fn:fmap.keySet()){
                        if(fn.endswith('__c')){
                                res = res + fn + ',';
                        }
                }
                return res.substring(0,res.length()-1);
        }
このメソッドは、特定のSobjectのフィールド名のうち、__cで終わるカスタム項目をすべて選択してカンマ区切りにして返しますので、こんな感じに使用してSoqlを発行すると良いです↓

        String wfnms = 'id,name,' +  getCustomFieldsNames(Item__c.SObjecttype);
        Item__c[] itms = Database.query('select ' + wfnms + ' from Item__c where ownerId=\'' + oid + '\'');

あえて、__cで終わるカスタム項目のみにしてあるのは、一部の標準項目をSoqlに指定するとエラーになるものがあるからです。

これで、オブジェクトにカスタム項目を追加してもApexをいじらなくてすむようになります。

実質的なselect * の完成!

「顧きゃく録」開発チームではこの方法を標準としてます。

(必ずすべてのカスタム項目を読むのでsalesforceのクラウド側からはありがたくないかも..)

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * -
     ネットのパワーを不動産業へ生かす!
     不動産業向け顧客管理・営業支援システム  顧きゃく録!
- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *

« Apex正規表現はJavaと"大体"同じだよ | トップページ | ApexのメソッドにSOAPでアクセスしてみるテスト »

Force.com」カテゴリの記事

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40142063

この記事へのトラックバック一覧です: Force.comのDBでselect * from が出来ないか:

« Apex正規表現はJavaと"大体"同じだよ | トップページ | ApexのメソッドにSOAPでアクセスしてみるテスト »