Memos About Salesforce

Salesforceにハマってたこと!

Salesforce sObject すべて項目取得メソッド これでSELECT *

f:id:jude2016:20190920155743j:plain

こんにちは、管理人の@Salesforce.Zです。

コーダーなら、クエリを書きますよね。普段は全然問題なし、なにもきにしないが、300個の項目取得や オブジェクトのレコードをまるまるコピーする時に厄介じゃないですか

今回、オブジェクトの項目をすべて取得するメソッドを書きました。このメソッドを使用禁止でも、 匿名コンソールなどで、実行すれば、結果をコピペに使ってもあり。なので、どうぞ。 もちろん、ご指摘も歓迎です。

読んだら得ること

★ オブジェクトの全項目を取得するメソッド
★ メソッドの実行結果をDAOクラスにコピペ

目次

全項目取得メソッド

全項目取得メソッド使用禁止の場合、コピペ(ほしい項目のみ)

//取引先のすべて項目のマップ取得
Map<String, Schema.sObjectField> omap = Account.sObjectType.getDescribe().fields.getMap();
String query = '';
Set<String> result = New Set<String>{};
    for(String s: omap.keySet()) {
        // カスタム項目だけ選択
        if (s.endsWith('__c')) {
            query += ', ';
            query += s;
            result.add(s);
        }
    }
system.debug('この結果をDAOクラスにコピペ ' + query);

コピペ問題点

コンソール匿名など、デバッグ結果からコピペを行う場合、100項目以上のような大きい設定オブジェクト(sObject)の場合、System.debug()の結果が field1c, field2c, ...}となり、表示しきれない。やっぱりメソッド化して、全部SELECTステートメントの後につないだほうが一番いい

メソッド化

public Set<String> getFieldApi(SObjectType sObjectType){
    Map<String, SObjectField> fields = sObjectType.getDescribe().fields.getMap();
    Set<String> result = new Set<String>();
    String query = '';
    for(String key :fields.keySet()){
        if (key.endsWith('__c')) {
            query += ', ';
            query += key;
            result.add(key);
        }
    }
    system.debug('この結果をDAOクラスにコピペ項目数: ' + result.size());

    return result;
}

system.debug('この結果をDAOクラスにコピペ :' + getNameField(Account.SObjecttype ));

メソッド化にしても、デバッグだけで、確認する場合、表示しきれない、大した問題ではないと思うかたもいるが 些細なことでも気になるので、表示しきれてほしい。

デバッグ専用メソッド化(改善版)

    /**
      * オブジェクトの全項目API取得
      */
        public Set<String> getFieldApi(SObjectType sObjectType){
        Map<String, SObjectField> fields = sObjectType.getDescribe().fields.getMap();
        Set<String> result = new Set<String>();
        String query = '';
        for(String key :fields.keySet()){
            if (key.endsWith('__c')) {
                query += ', ';
                query += key;
                result.add(key);
            }
        }
        system.debug('この結果をDAOクラスにコピペ項目数: ' + result.size());

        return result;
    }

コンソール匿名で、getFieldApiメソッドをコール

    Set<String> fldList = getFieldApi(Account.SObjecttype );
    String query1 = '';
    String query2 = '';
    String query3 = '';
    Integer index = 0;
    for(String api :fldList){
        if(index < 20){
            query1 += ' , ';
            query1 += api;
        }else if(index < 40){
            query2 += ' , ';
            query2 += api;
        }else{
            query3 += ' , ';
            query3 += api;
        }
        index++;
    }
    system.debug('この結果をDAOクラスにコピペ(query1) ' + query1);
    system.debug('この結果をDAOクラスにコピペ(query2) ' + query2);
    system.debug('この結果をDAOクラスにコピペ(query3) ' + query3);

項目数に応じて、ifステートメントの条件を適切に変更すれば、全部表示しきれることができる

ここまで、やる必要があるかどうか、また別として、これで、コンソール匿名で、全部表示しきれることができる。