Проблема SOQL при запросе истории активности как подзапроса..

Я запрашиваю ActivityHistory, и кажется, что вы можете запрашивать его только как объект ПОДЗАПРОСА относительно какого-либо другого объекта. Это нормально - я изменил свой запрос на запрос к объекту Account с ActivityHistory в подзапросе. Казалось, работает нормально. Но при тестировании я обнаружил случай, когда подзапрос ActivityHistory вернул БОЛЕЕ 200 результатов. Я начал получать эту ошибку:

    FATAL_ERROR|System.QueryException: entity type ActivityHistory does not support query

... в журналах отладки. Кажется, это проблема только в том случае, если учетная запись имеет более 199 связанных записей в объекте ActivityHistory. Чтобы проверить, не в этом ли причина, я попытался добавить в подзапрос предложение LIMIT 199 и LIMIT 200. Конечно же, когда я использую 199 (или что-то ниже), он работает нормально. Использование 200 (или больше) приводит к указанной выше ошибке.

Мой код ниже. Следует отметить, что запрос находится в цикле FOR. У меня есть одна теория относительно того, почему возникает ошибка для высоких значений предложения LIMIT, заключается в том, что, возможно, 200 — это точка, в которой цикл FOR разделяет запрос на отдельные фрагменты — возможно, второй фрагмент не квалифицируется как «подзапрос». (поскольку он работает отдельно?) - и SalesForce это не нравится.

Да, и еще кое-что: тот же код, похоже, нормально работает в редакторе Anonymous Apex (хотя мне пришлось внести несколько изменений — заменить встроенные переменные явными значениями).Странно, что анонимному редактору это вполне нравится, а серверам SFDC это не нравится.

В любом случае, я пойду устранять неполадки. У кого-нибудь есть идеи?

Спасибо!

Код:

    //  ActivityHistory's on Account
    for (Account a : [  //  you can't query ActivityHistory directly; only in a subquery against another object type
        SELECT
             Id
            ,Name
            ,( SELECT
                    ActivityDate
                   ,ActivityType
                   ,CRM_Meeting_Type__c
                   ,Description
                   ,CreatedBy.Name
                   ,Status
                   ,WhatId
                FROM ActivityHistories
                WHERE ActivityType IN :included_activity_history_types
                //LIMIT 200
            )
        FROM Account WHERE Id = :accountId
    ]) {
     for (ActivityHistory ah : a.ActivityHistories) {
        if ( ah.WhatId==null ) { continue; }  //  skip adding activities without a WhatId

        if (((string)ah.WhatId).startsWith('001')) { //  only add ActivityHistory's tied directly to an Account (the query above pulls back all ActivityHistory's on related Oppty's as well)
            activities.add(new ActivityWrapper(ah));
        }
     }
    }
6
задан loneboat 7 June 2012 в 21:00
поделиться