Вы находитесь здесь:
Архивирование запросов данных Apex
Архивирование запросов данных Apex включает программный доступ к архивным данным в приложении «Архивирование». Эти запросы данных автоматизируют бизнес-процессы, поддерживают сторонние системные интеграции, создают настраиваемые представления и отчеты и ссылаются на архивные данные с активными записями.
Компонент «Архивирование» и «Архивный поиск» предоставляют параметры для извлечения данных вручную. Apex предлагает расширенные возможности, например, параметры запроса, фильтры и пагинацию, для прямого доступа к данным посредством кода.
Функции запроса данных Apex включают:
- Поиск архивных записей посредством указанных критериев.
- Используйте частичное совпадение звездочкой (*).
- Возврат больших наборов данных пакетами до 1 000 записей на страницу.
- Примените не более шести фильтров для уточнения результатов.
Данные системные объекты Salesforce отфильтрованы и недоступны для поиска посредством Apex.
FeedHistoryRelationShare
Чтобы сохранить оптимальную производительность и убедиться в возврате только актуальных архивных данных, архив исключает эти объекты из поиска.
Для доступа к архивным файлам используйте компонент «Архивировать» или «Архивировать поиск».
Архивирование методов запроса данных Apex
Чтобы определить способ запроса архивных данных, задайте метод, предоставленный Archive Apex.
- Доступ к архивным данным: методы в
ArchiverAccessorпредназначены для взаимодействия с архивными записями. Потом можно создать запросы и извлечь данные, сохраненные в продукте «Архивирование». - Определение операций запроса: эти подписи сообщают, какие типы запросов можно выполнять посредством Apex, например, глобальные поиски и отфильтрованные запросы.
- Руководящее использование: изучая подписи методов, разработчики могут понять вводные и выходные данные, необходимые для их внедрения.
Метод performArchiverGlobalSearch
Этот метод определяет функции для выполнения глобального поиска архивных данных.
Параметры Query
Запросы данных Apex используют несколько параметров для настройки поиска. Некоторые параметры обязательны, в то время как другие необязательны. Понимание способа настройки каждого параметра помогает получить самые точные и актуальные результаты.
- Имя объекта: определяет тип объекта Salesforce для запроса.
Например,
string sObjectName = 'Account'указывает, что запрос нацелен на записи организаций.Данный параметр является обязательным.
Примечание Каждый запрос нацелен на один объект. Используйте отдельные запросы для извлечения данных из нескольких объектов. - Фильтры поиска: фильтры, ограничивающие результаты поиска на основе условий поля.
- Имя поля: поле для фильтрации (например,
NameилиCreatedDate) - Значение или список значений—Конкретное значение или значения, которым нужно соответствовать
Пример: Фильтр одного значения
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');Этот запрос возвращает записи, где поле «Имя» соответствует строке «тест».
Пример: Фильтр нескольких значенийSF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});Этот запрос возвращает записи, где поле «Статус» соответствует строкам «Открыто» или «Закрыто».
Обработка пустых или нулевых значений: для поиска записей, где поле пустое или нулевое, можно добавить пустую строку («») к списку значений.Пример:
Этот запрос возвращает записи обращений, где поле «Тема» пустое или нулевое.List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));Ограничения фильтров поиска:
- Запросы должны содержать как минимум 1 фильтр на запрос.
- Запросы могут содержать не более 6 фильтров в сочетании с логикой
ANDна запрос. - По умолчанию фильтры объединены посредством логики
AND. ЛогикаORв данный момент не поддерживается. - Список значений фильтра не может превышать 1 000 элементов.
Данный параметр является обязательным.
- Имя поля: поле для фильтрации (например,
- Фильтры дат: если вы хотите искать по датам, используйте параметр
DateRangeи обязательные фильтры.DateRangeфильтрует записи по полям (например,ArchiveDate,CreatedDateилиModifiedDate).Пример: Фильтр даты для определенного запроса даты
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);Этот запрос возвращает записи, архивированные между 1 января 2024 года и сегодняшним днем.
Пример: Фильтр дат для нескольких диапазонов дат
List<SF_Archive.SearchFilter> filters = new List<SF_Archive.SearchFilter>(); SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test'); filters.add(filter); string sObjectName = 'Account'; Date myDate = Date.newInstance(2024, 1, 11); // January 11, 2024 Date myDate2 = Date.newInstance(2023, 12, 25); // December 12, 2023 SF_Archive.dateRange range = new SF_Archive.dateRange('CreatedDate', myDate, myDate); SF_Archive.dateRange range2 = new SF_Archive.dateRange('CreatedDate', myDate2, myDate2); list<SF_Archive.dateRange> ranges = new list<SF_Archive.dateRange> {range, range2}; SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, filters, ranges);Этот запрос возвращает записи, архивированные между 12 декабря 2023 года и 11 января 2024 года.
Рекомендации по фильтрации даты:
- Для поиска на основе даты архивирования добавьте поле даты
archive_date. - Используйте формат даты Apex: ММ/ДД/ГГГГ.
Это необязательный параметр.
- Для поиска на основе даты архивирования добавьте поле даты
- Возвращенные поля: укажите поля для добавления в результаты. Если не указано, возвращаются все поля.
Пример: Возврат определенных полей
List<string> fields = new List<string>{'Name', 'CreatedDate'};Этот запрос возвращает только поля
NameиCreatedDateдля каждой записи.Это необязательный параметр.
- Размер страницы: определяет количество записей в запросе. Количество записей по умолчанию на запрос составляет 25, максимальное — 1000.
Пример: Размер настраиваемой страницы
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);Этот запрос возвращает 100 записей на страницу.
Это необязательный параметр.Примечание Превышение 1000 записей в запросе инициирует ошибку среды выполнения. - Направление сортировки: сортировка результатов по полю (например,
CreatedDate).- По возрастанию (
asc): От старого до нового. - По убыванию (
desc): От самого нового до самого старого.Пример: Запрос сортировки
SortingDirection sortingDirection = new SortingDirection('desc');Этот запрос возвращает записи, отсортированные по убыванию на основе их
CreatedDate.Это необязательный параметр.
- По возрастанию (
Метод getNextPage
Если все результаты не помещаются на одной странице, этот метод вызывает следующую страницу.
Параметр ScrollId
Используйте пагинацию для возврата больших наборов данных, извлекая результаты на страницах до 1 000 записей.
Чтобы настроить бизнес-правило пагинации, выполните первичный запрос, используйте scrollId из ответа для извлечения последующих страниц и продолжайте до scrollId = '-1'..
Пример: Извлечение результатов посредством пагинации
// Perform initial search query
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account',
filters, 100, fields);
// Get the search response
SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
// Process first page of results
system.debug('Total result count: ' + searchResponse.totalResultCount);
system.debug('Records: ' + searchResponse.records);
// Fetch next page using the scrollId
if (searchResponse.scrollId != '-1') {
SF_Archive.ArchiverAccessorResponse nextPageRes = SF_Archive.ArchiverAccessor.getNextPage(searchResponse.scrollId);
SF_Archive.ArchiverAccessorSearchResponse nextPageResponse = nextPageRes.getSearchResponseMap();
system.debug('Next Page Records: ' + nextPageResponse.records);
}Доступ к методам
Чтобы найти подписи метода, перейдите в классы Apex в разделе «Настройка». Откройте класс ArchiverAccessor. Найдите все методы, указанные в пространстве имен performArchiverGlobalSearch.
Пример запроса данных
Данный пример извлекает записи Account посредством данных условий.
- Поля:
Name,CreatedDate - Ограничение: 100 записей на страницу
- Имя: Содержит строку «test»
- Сортировка: По убыванию по
CreatedDate
List<SF_Archive.SearchFilter> filters = new List<SF_Archive.SearchFilter>();
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');
filters.add(filter);
List<string> fields = new List<string>{'Name', 'CreatedDate'};
SortingDirection sortingDirection = new SortingDirection('desc');
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account',
filters, 100, fields, sortingDirection);
Устранение распространенных ошибок
| Код ошибки | Описание | Решение |
|---|---|---|
INTERNAL_ERROR |
Произошел неожиданный сбой. | Обратитесь в службу поддержки со сведениями об ошибке. |
RESOURCE_LIMIT_ERROR |
Превышение ограничений пагинации или размера запроса. | Уменьшите размер страницы или настройте фильтры поиска. |
VALIDATION_ERROR |
Отсутствуют или недействительны критерии поиска. | Убедитесь, что все поля и фильтры действительны. |
Дополнительные рекомендации
- Отслеживайте использование API во избежание достижения ограничений.
- Чтобы отправить ответ на объект, сериализуйте его в JSON, а потом десериализуйте обратно в объект.
- Проверьте включение и доступность полей.
- Перепроверьте все параметры запроса.
- По нерешенным проблемам обратитесь в службу поддержки Salesforce с подробными журналами.
Пошаговые процедуры тестирования см. в разделе «Архивирование тестирования Apex».
- Архивирование запросов данных Apex: пример кода
В данном примере кода фильтр, диапазон дат и запрос поиска архива проверяются посредством кода статуса в приложении «Архивирование». - Архивирование запросов данных Apex: пример сценария использования 1
Этот пример сценария использования показывает, как создать и настроить компонент, отображающий организации с высоким приоритетом в приложении «Архивирование». - Архивирование запросов данных Apex: пример сценария использования 2
Этот пример сценария использования отображает, как Archive Apex обрабатывает задачи без превышения контролирующих ограничений, например, ограничений процессора или выносок времени ожидания, в приложении «Архивировать».
Архивирование запросов данных Apex: пример кода
В данном примере кода фильтр, диапазон дат и запрос поиска архива проверяются посредством кода статуса в приложении «Архивирование».
Вызов getNextPage после (scrollId != -1) добавлен, поскольку размер результатов ограничен в вызове performArchiverGlobalSearch.
string sObjectName = 'Account';
list<SF_Archive.SearchFilter>request = new list<SF_Archive.SearchFilter>();
SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('Name', 'test');
request.add(filter1);
SF_Archive.dateRange range = new SF_Archive.dateRange('CreatedDate', system.today()-150, system.today());
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, range);
if(res.getStatusCode() == 200){
system.debug('code: ' + res.getStatuscode());
SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
system.debug('count: '+ searchResponse.totalResultCount);
system.debug('scrollid: '+ searchResponse.scrollId);
system.debug('list size: '+ searchResponse.records.size());
string scrollId = searchResponse.scrollId;
integer page = 1;
while(scrollId != '-1'){
page++;
SF_Archive.ArchiverAccessorResponse secondPage =
SF_Archive.ArchiverAccessor.getNextPage(searchResponse.scrollId);
if(secondPage.getStatusCode() == 200){
SF_Archive.ArchiverAccessorSearchResponse searchResponse2 = secondPage.getSearchResponseMap();
scrollId = searchResponse2.scrollId;
system.debug('count: '+ searchResponse2.totalResultCount);
system.debug('scrollid: '+ searchResponse2.scrollId);
system.debug('list size: '+ searchResponse2.records.size());
system.debug('page number: '+ page);
} else{
system.debug('response is != 200: '+ secondPage.getStatusCode());
system.debug('body: '+ secondPage.getBody());
break;
}
}
} else {
system.debug('status code erorr|: '+ res.getStatusCode());
system.debug('status code message|: '+ res.getErrorMessage());
}Архивирование запросов данных Apex: пример сценария использования 1
Этот пример сценария использования показывает, как создать и настроить компонент, отображающий организации с высоким приоритетом в приложении «Архивирование».
Способы использования
Вашему предприятию требуется, чтобы группа поддержки уровня 3 имела доступ к просмотру архивных обращений со статусом высокого приоритета.
Данный пример показывает, как:
- Создайте настроенный веб-компонент Lightning (LWC).
- Извлеките архивные данные посредством запросов данных Apex.
- Примените фильтр (высокий приоритет). Примечание Другие фильтры можно настроить, обратившись к коду в разделе «Архивирование запросов данных Apex — пример кода».
Данный пример ограничен 25 записями. Apex позволяет установить результаты на уровне 1000 на страницу. По умолчанию используется значение «25» с возможностью пагинации результатов.
Компонент, отображающий обращения с высоким приоритетом
Пример SdkUseCaseWidget.js
В данном примере кода параметром является AccountRecordId.
import { LightningElement, api, track } from 'lwc';
import getCases from '@salesforce/apex/ArchiveSdk.getCases';
export default class SampleSdkUseCaseWidget extends LightningElement {
@api recordId;
columns = [
{ label: 'Case Number', fieldName: 'caseNumber', type: 'text', cellAttributes: {alignment: 'center'}},
{ label: 'Subject', fieldName: 'subject', type: 'text' , cellAttributes: {alignment: 'center'}, },
{ label: 'Priority', fieldName: 'priority', type: 'text', cellAttributes: {alignment: 'center'}, },
{ label: 'Status', fieldName: 'status', type: 'text', cellAttributes: {alignment: 'center'}, }
];
@track records;
@track data
@track _loading;
async connectedCallback() {
this._loading = true;
try {
const result = await getCases({parentId: this.recordId})
this.records = result;
this._loading = false;
} catch (error) {
this._loading = false;
}}
} Пример SdkUseCaseWidget.html
Контроллер Apex, используемый LWC, вызывает запросы данных Apex.
SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);Это вызов Archive Apex. Он содержит следующие параметры.
- sObjectName: отображает поиск
- Фильтры: используются для извлечения данных
- Поля—Проецируемые поля для возврата из данных.
- Диапазон: диапазон дат, используемый для запроса данных.
<template>
<template if:true={_loading}>
<lightning-spinner></lightning-spinner>
</template>
<lightning-datatable
key-field="caseNumber"
data={records}
columns={columns}
hide-checkbox-column>
</lightning-datatable>
</template>ArchiveSdk.cls
Этот блок кода является контроллером Apex.
public with sharing class ArchiveSDK {
@AuraEnabled
public static List<CaseTableWrapperExample.CaseRecord> getCases(String parentId) {
// Create an empty list to hold maps with String keys and Object values
List<Map<String, Object>> totalRecords = new List<Map<String, Object>>();
// Create a list to store search filter objects
List<SF_Archive.SearchFilter> request = new List<SF_Archive.SearchFilter>();
// Create a search filter for the 'AccountId' field with a given 'parentId' value
SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('AccountId', parentId);
// Create a search filter for the 'Priority' field with a given 'High' value
SF_Archive.SearchFilter filter2 = new SF_Archive.SearchFilter('Priority', 'High');
// Add the filters to the request list
request.add(filter1);
request.add(filter2);
// Define the object name as 'Case'
String sObjectName = 'Case';
// Create a list of Strings representing field names to be retrieved from Archive DB
List<String> fields = new List<String>{'CaseNumber', 'Subject', 'Priority', 'Status'};
// Create the DateRange based on the created date
SF_Archive.DateRange range = new SF_Archive.DateRange('CreatedDate', system.today() - 150, system.today());
// Perform an initial global search and store the response
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, range);
// Check if the HTTP response status code is 200 (success)
if (res.getStatusCode() == 200) {
system.debug('code: ' + res.getStatuscode());
// Retrieve the initial search response map
SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
system.debug('count: ' + searchResponse.totalResultCount);
system.debug('scrollid: ' + searchResponse.scrollId);
system.debug('list size: ' + searchResponse.records.size());
// Store the scroll ID for pagination
String scrollId = searchResponse.scrollId;
// Initialize the page number
Integer page = 1;
// Add the records from the initial search to the totalRecords list
totalRecords.addAll(searchResponse.records);
// Continue to fetch additional pages while the scroll ID is not '-1'
while (scrollId != '-1') {
page++;
// Get the next page of search results using the UPDATED scrollId
SF_Archive.ArchiverAccessorResponse nextPageResponse = SF_Archive.ArchiverAccessor.getNextPage(scrollId);
// Check if the HTTP response status code is 200 (success)
if (nextPageResponse.getStatusCode() == 200) {
// Retrieve the search response for the current page
SF_Archive.ArchiverAccessorSearchResponse searchResponse2 = nextPageResponse.getSearchResponseMap();
// CRITICAL FIX: Update the scrollId with the value from the new response
scrollId = searchResponse2.scrollId;
system.debug('count: ' + searchResponse2.totalResultCount);
system.debug('scrollid: ' + searchResponse2.scrollId);
system.debug('list size: ' + searchResponse2.records.size());
system.debug('page number: ' + page);
// Add the records from the current page to the totalRecords list
totalRecords.addAll(searchResponse2.records);
} else {
// Output an error message if the HTTP response status code is not 200
system.debug('response is != 200: ' + nextPageResponse.getStatusCode());
system.debug('body: ' + nextPageResponse.getBody());
// Break out of the loop if there is an error
break;
}
} // End of while loop
} else {
// Handle error from initial search
system.debug('status code error: ' + res.getStatusCode());
system.debug('status code message: ' + res.getErrorMessage());
}
// Return the list of total records
List<CaseTableWrapperExample.CaseRecord> result = new List<CaseTableWrapperExample.CaseRecord>();
return CaseTableWrapperExample.getCasesTable(totalRecords);
}
}CaseTableWrapperExample.cls
Класс помощника для формулирования класса из Apex в LWC
public class CaseTableWrapperExample{
public static List<caseRecord> getCasesTable(list<map<string,object>> cases){
List<caseRecord> caseReturnList = new List<caseRecord>();
for(Map<string,object> caseRecord: cases){
caseRecord tempCase = new caseRecord();
tempCase.caseNumber = String.valueOf(caseRecord.get('CaseNumber'));
tempCase.id = String.valueOf(caseRecord.get('Id'));
tempCase.origin = String.valueOf(caseRecord.get('Origin'));
tempCase.status = String.valueOf(caseRecord.get('Status'));
tempCase.subject = String.valueOf(caseRecord.get('Subject'));
tempCase.priority = String.valueOf(caseRecord.get('Priority'));
caseReturnList.add(tempCase);
}
return caseReturnList;
}
public class caseRecord {
@AuraEnabled public string caseNumber;
@AuraEnabled public string id;
@AuraEnabled public string origin;
@AuraEnabled public string status;
@AuraEnabled public string priority;
@AuraEnabled public string subject;
}}Вышеуказанный код описывает пример сценария, с помощью которого можно добавить LWC в качестве компонента на страницу Lightning.
Для просмотра фактической таблицы данных Lightning добавьте этот код к файлу sampleSdkUseCaseWidget.js-meta.xml. Потом добавьте компонент «Архивировать» на страницу Lightning.
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="<a href='http://soap.sforce.com/2006/04/metadata">;
<apiVersion>55.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__RecordPage</target>
<target>lightning__AppPage</target>
</targets>
<targetConfigs>
<targetConfig targets="lightning__RecordPage">
<supportedFormFactors>
<supportedFormFactor type="Small" />
<supportedFormFactor type="Large" />
</supportedFormFactors>
</targetConfig>
<targetConfig targets="lightning__AppPage">
<supportedFormFactors>
<supportedFormFactor type="Small" />
<supportedFormFactor type="Large" />
</supportedFormFactors>
</targetConfig>
</targetConfigs>
</LightningComponentBundle>Архивирование запросов данных Apex: пример сценария использования 2
Этот пример сценария использования отображает, как Archive Apex обрабатывает задачи без превышения контролирующих ограничений, например, ограничений процессора или выносок времени ожидания, в приложении «Архивировать».
Дополнительную информацию см. в разделе Ограничения Apex Governor.
Способы использования
Вашему предприятию требуется, чтобы группа поддержки уровня 3 имела доступ к просмотру архивных обращений со статусом высокого приоритета.
Данный пример показывает, как обойти ошибку, если количество архивных записей, извлеченных посредством Apex, слишком велико. Ошибка гласит: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
Код из этих классов Apex создает этот сценарий использования.
Класс ArchiveSecondPageJob обрабатывает пагинированные данные из архива посредством кода прокрутки, вынося при необходимости выноски. Он выполняется асинхронно посредством интерфейса «Очередь», отслеживая общее время выполнения, чтобы избежать превышения ограничений и при необходимости создавая очередь для продолжения обработки. Класс обрабатывает ответы, обновляет код прокрутки и регистрирует сведения о каждой странице извлеченных данных.
public class ArchiveSecondPageJob implements Queueable,Database.AllowsCallouts {
private String scrollId;
private long totalTime;
private integer pageNumber;
public archiveSecondPageJob(String prevScrollId, integer pageNumber) {
scrollId = prevScrollId;
this.pageNumber = pageNumber;
}
public void execute(QueueableContext context) {
system.debug('executing');
doExecute();
}
private void doExecute() {
SF_Archive.ArchiverAccessorSearchResponse searchResponse = null;
integer page = 1;
long totalTime = 0;
while(scrollId != '-1')
{
//avoid 12000 ms limit
if(totalTime > 90000){
system.debug('Creating new task');
archiveSecondPageJob q = new archiveSecondPageJob(scrollId,this.pageNumber);
System.enqueueJob(q);
return;
}
//Get the next page using the scrollId
Long startTime = DateTime.now().getTime();
SF_Archive.ArchiverAccessorResponse nextPage = SF_Archive.ArchiverAccessor.getNextPage(scrollId);
Long stopTime = DateTime.now().getTime();
totalTime += stopTime - startTime;
if(nextPage.getStatusCode() == 200){
this.pageNumber++;
SF_Archive.ArchiverAccessorSearchResponse searchResponse2 =nextPage.getSearchResponseMap();
scrollId = searchResponse2.scrollId;
system.debug('count: '+ searchResponse2.totalResultCount);
system.debug('scrollid: '+ searchResponse2.scrollId);
system.debug('list size: '+ searchResponse2.records.size());
system.debug('body: '+ searchResponse2.records);
system.debug('page: '+ pageNumber);
system.debug('time: '+ totalTime);
}
else{
system.debug('response is != 200: '+ nextPage.getStatusCode());
system.debug('body: '+ nextPage.getBody());
return;
}
}
}
}
Класс ArchiveSearch выполняет поиск по объекту «Обращение» посредством определенных фильтров, извлекает результаты и регистрирует такие сведения, как общее количество и код прокрутки. Если поиск возвращает действительный код прокрутки, указывающий на дополнительные страницы результатов, он ставит archiveSecondPageJob в очередь для асинхронной обработки следующей страницы. Этот класс, по сути, инициирует поиск и передает дальнейшую обработку заданным ранее archiveSecondPageJob.
Ниже указан формат первичного поискового вызова.
public class ArchiveSearch {
public void doSearch(){
string sObjectName = 'Case';
list<SF_Archive.SearchFilter> request = new list<SF_Archive.SearchFilter>();
SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('Priority', 'High');
request.add(filter1);
list<string> fields = new list<string>{'CaseNumber', 'Id'};
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields);
if(res.getStatusCode() == 200){
system.debug('code: ' + res.getStatuscode());
SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
system.debug('count: '+ searchResponse.totalResultCount);
system.debug('scrollid: '+ searchResponse.scrollId);
system.debug('list size: '+ searchResponse.records.size());
string scrollId = searchResponse.scrollId;
integer page = 1;
if(scrollId != '-1'){
system.debug('calling next page');
integer pageNumber = 2;
archiveSecondPageJob q = new archiveSecondPageJob(scrollId, pageNumber);
System.enqueueJob(q);
}}}}Дополнительную информацию см. в Руководстве разработчика Salesforce Apex.

