• OginoMai
  • NEWBIE
  • 10 Points
  • Member since 2017

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 1
    Questions
  • 1
    Replies
バッチ処理を実行すると、【Apex heap size too large】とエラーが発生します。
そこで、SOQL文を見直したのですがエラーは変わりませんでした。
※Account(取引先)は約2,300件ほど。

見直し前)
 'SELECT ' + util.getAllItem('Account') + ' FROM Account
 ※util.getAllItemと言う関数は、全てのAccount項目を取得する関数との事です。(最下部貼り付けております。)
 ※アカウント項目は全部で187項目。

見直し後)
 'SELECT ' + util.getAllItem('Account') + ' FROM Account WHERE (uniNumber__c >= \'0000000001\' AND uniNumber__c <= \'0000001000\')';

見直し前と後では、取得するレコード数には大きく差がある(1,000件以上)と思うのですが、
なぜか【Apex heap size too large】が引き続き発生している状況です。

上記見直し後のSOQL文も、最初に全Account(取引先)データを取得してしまうのでしょうか?

何かご存知の方がいらっしゃいましたら、少しでもご教授頂けますと幸いです。
どうぞよろしくお願いいたします。

■util.getAllItem■
Utilクラス
    public String getAllItem(String obj){
        Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
        Schema.SObjectType s = m.get(obj) ;
        Schema.DescribeSObjectResult r = s.getDescribe() ;
        Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
        string soql = '';
        for (String fieldName : fields.keyset()) {
            if (soql != '') {
                soql += ', ';
            }
            soql += fieldName;
        }

        return soql;
    }
バッチ処理を実行すると、【Apex heap size too large】とエラーが発生します。
そこで、SOQL文を見直したのですがエラーは変わりませんでした。
※Account(取引先)は約2,300件ほど。

見直し前)
 'SELECT ' + util.getAllItem('Account') + ' FROM Account
 ※util.getAllItemと言う関数は、全てのAccount項目を取得する関数との事です。(最下部貼り付けております。)
 ※アカウント項目は全部で187項目。

見直し後)
 'SELECT ' + util.getAllItem('Account') + ' FROM Account WHERE (uniNumber__c >= \'0000000001\' AND uniNumber__c <= \'0000001000\')';

見直し前と後では、取得するレコード数には大きく差がある(1,000件以上)と思うのですが、
なぜか【Apex heap size too large】が引き続き発生している状況です。

上記見直し後のSOQL文も、最初に全Account(取引先)データを取得してしまうのでしょうか?

何かご存知の方がいらっしゃいましたら、少しでもご教授頂けますと幸いです。
どうぞよろしくお願いいたします。

■util.getAllItem■
Utilクラス
    public String getAllItem(String obj){
        Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
        Schema.SObjectType s = m.get(obj) ;
        Schema.DescribeSObjectResult r = s.getDescribe() ;
        Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
        string soql = '';
        for (String fieldName : fields.keyset()) {
            if (soql != '') {
                soql += ', ';
            }
            soql += fieldName;
        }

        return soql;
    }