Я запрашиваю 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)); } } }