詳細情報:
Apex データクエリのアーカイブ
アーカイブ Apex データクエリを使用すると、アーカイブアプリケーションのアーカイブデータにプログラムでアクセスできます。これらのデータクエリは、ビジネスプロセスの自動化、サードパーティのシステムインテグレーションのサポート、カスタムビューとレポートの作成、有効なレコードとのアーカイブデータの相互参照を行います。
[アーカイブ] コンポーネントと [アーカイブ検索] には、手動でデータを取得するオプションがあります。Apex は、クエリ・パラメータ、フィルタ、ページネーションなどの高度な機能を備えており、コードを使用してデータに直接アクセスできます。
Apex データクエリには次の機能があります。
- 指定した条件を使用してアーカイブ済みレコードを検索します。
- アスタリスク (*) を使用して部分一致を使用します。
- ページあたり最大 1,000 件のレコードのバッチで大きなデータセットを返します。
- 最大 6 個の検索条件を適用して結果を絞り込みます。
- オブジェクトが本番組織から削除された場合でも、アーカイブ済みレコードを照会します。
これらのシステム関連の Salesforce オブジェクトは除外され、Apex で検索できません。
FeedHistoryRelationShare
最適なパフォーマンスを維持し、関連するアーカイブデータのみが返されるように、アーカイブではこれらのオブジェクトが検索から除外されます。
アーカイブ済みファイルにアクセスするには、アーカイブコンポーネントまたはアーカイブ検索を使用します。
Archive Apex では、次の要求制限が適用されます。
| 間隔 | 要求の制限 |
|---|---|
| 毎分 | 1000 |
| 時間あたり | 30,000 |
| 1 日あたり | 100000 |
この制限を超えると、HTTP 状況コード 429 を受信します。
Apex データのアーカイブクエリメソッド
アーカイブ データを照会する方法を定義するには、Archive Apex で提供される方法を設定します。
- アーカイブデータへのアクセス —
ArchiverAccessor内のメソッドは、アーカイブされたレコードを操作するように設計されています。その後、クエリを作成し、アーカイブ製品に保存されているデータを取得できます。 - クエリ操作の定義:これらのシグニチャは、グローバル検索や絞り込まれたクエリなど、Apex を使用して実行できるクエリの種類を示します。
- 使用方法のガイド — メソッド署名を調べることで、開発者は実装に必要な入力と出力を理解できます。
performArchiverGlobalSearch メソッド
このメソッドは、アーカイブされたデータに対してグローバル検索を実行する機能を示します。
Query パラメータ
Apex データクエリでは、いくつかのパラメータを使用して検索を絞り込みます。必須のパラメーターもあれば、省略可能なパラメーターもあります。各パラメーターの設定方法を理解することで、最も正確で関連性の高い結果を得ることができます。
- オブジェクト名 — 照会する Salesforce オブジェクトの種別を指定します。
たとえば、
string sObjectName = 'Account'は、クエリの対象が取引先レコードであることを指定します。このパラメーターは必須です。
メモ 各クエリは 1 つのオブジェクトを対象とします。複数のオブジェクトからデータを取得するには、個別のクエリを使用します。 - 検索条件 — 項目条件に基づいて検索結果を絞り込みます。
- Field Name — 絞り込むフィールド (
NameやCreatedDateなど) - 値または値のリスト — 照合する特定の値 (複数可)
例: 単一値検索条件
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');このクエリは、[名前] 項目が文字列 "test" に一致するレコードを返します。
例: 複数値検索条件SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});このクエリは、[状況] 項目が文字列「オープン」または「クローズ」に一致するレコードを返します。
空または Null 値の処理 — 項目が空または null のレコードを検索するには、空の文字列 (%) を値のリストに追加します。例:
このクエリは、[件名] 項目が空または null のケースレコードを返します。List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));検索条件の制限:
- クエリには、クエリごとに少なくとも 1 つの検索条件が必要です。
- クエリには、クエリごとに最大 6 個の検索条件を
ANDロジックと組み合わせて使用できます。 - デフォルトでは、フィルタは
ANDロジックを使用して結合されます。ORロジックは現在サポートされていません。 - 検索条件の値リストは、1,000 項目を超えることはできません。
このパラメーターは必須です。
- Field Name — 絞り込むフィールド (
- 日付フィルタ — 日付に基づいて検索するには、
DateRangeパラメータと必須フィルタを使用します。DateRangeは、ArchiveDate、CreatedDate、ModifiedDateなどの項目でレコードを絞り込みます。例: 特定の日付クエリの日付検索条件
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);このクエリは、2024 年 1 月 1 日から今日までの間にアーカイブされたレコードを返します。
例: 複数の日付範囲の日付検索条件
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);このクエリは、2023 年 12 月 12 日から 2024 年 1 月 11 日までにアーカイブされたレコードを返します。
日付検索条件のおすすめ:
- アーカイブ日に基づいて検索するには、
archive_date日フィールドを追加します。 - Apex 日付形式 (MM/DD/YYYY) を使用します。
このパラメーターは省略可能です。
- アーカイブ日に基づいて検索するには、
- 返される項目 — 結果に含める項目を指定します。指定しない場合、すべての項目が返されます。
例: 特定の項目を返す
List<string> fields = new List<string>{'Name', 'CreatedDate'};このクエリでは、各レコードの
Name項目とCreatedDate項目のみが返されます。このパラメーターは省略可能です。
- ページサイズ — クエリあたりのレコード数を設定します。クエリあたりのデフォルトのレコード数は 25、最大数は 1,000 です。
例: カスタムページサイズ
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);このクエリでは、ページあたり 100 件のレコードが返されます。
このパラメーターは省略可能です。メモ クエリのレコード数が 1,000 件を超えると、実行時エラーが発生します。 - Sorting Direction (並び替えの方向) —
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 クラス」と入力し、[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 サポートに連絡して詳細なログを入手してください。
テスト手順の詳細は、「Archive Apex Testing」を参照してください。
- Apex データクエリのアーカイブ — コード例
次のコード例では、検索条件、日付範囲、アーカイブ検索要求がアーカイブアプリケーションのステータスコードを使用して検証されます。 - Apex データクエリのアーカイブ — サンプル使用事例 1
この使用事例では、アーカイブアプリケーションに優先度の高い取引先を表示するコンポーネントを作成してカスタマイズする方法を示します。 - Apex データクエリのアーカイブ — サンプル使用事例 2
この使用事例では、Archive Apex が Archive アプリケーションでガバナ制限 (CPU 制限やタイムアウト コールアウトなど) を超えないで ToDo を処理する方法を示します。
Apex データクエリのアーカイブ — コード例
次のコード例では、検索条件、日付範囲、アーカイブ検索要求がアーカイブアプリケーションのステータスコードを使用して検証されます。
(scrollId != -1) に続く getNextPage コールは、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
この使用事例では、アーカイブアプリケーションに優先度の高い取引先を表示するコンポーネントを作成してカスタマイズする方法を示します。
使用事例
優先度の高い状況のアーカイブ済みケースを参照するには、Tier 3 サポートチームへのアクセス権が必要です。
次に、例を示します。
- カスタマイズされた Lightning Web コンポーネント(LWC)を作成します。
- Apexデータ・クエリを使用して、アーカイブ・データを取り込みます。
- 検索条件 (優先度高) を適用します。メモ その他のフィルタは、「Apex データクエリのアーカイブ — コード例」のコードを参照してカスタマイズできます。
この例では、25 件のレコードに制限されています。Apex では、結果を 1 ページあたり 1,000 件に設定できます。デフォルトは 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
LWC で使用される Apex コントローラは、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 が Archive アプリケーションでガバナ制限 (CPU 制限やタイムアウト コールアウトなど) を超えないで ToDo を処理する方法を示します。
詳細は、「Apex ガバナ制限」を参照してください。
使用事例
優先度の高い状況のアーカイブ済みケースを参照するには、Tier 3 サポートチームへのアクセス権が必要です。
この例では、Apex で取得されるアーカイブ済みレコードの数が多すぎる場合のエラーを回避する方法を示します。エラーは「SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support」です。
これらの Apex クラスのコードによって、次の使用事例が作成されます。
ArchiveSecondPageJob クラスは、スクロール ID を使用してアーカイブからページ設定されたデータを処理し、必要に応じてコールアウトを実行します。Queueable インターフェースを介して非同期に実行され、制限を超えないように合計実行時間を追跡し、必要に応じて処理を続行するために自分自身をキューに入れます。このクラスは応答を処理し、スクロール ID を更新して、取得した各データページの詳細を記録します。
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 クラスは、特定の検索条件を使用して Case オブジェクトの検索を実行し、結果を取得して、合計数やスクロール ID などの詳細を記録します。検索で有効なスクロール ID が返された場合、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 Developer Guide (Salesforce Apex 開発者ガイド)』を参照してください。

