您位於此處:
封存 Apex 資料查詢
「歸檔 Apex 資料查詢」可在「歸檔」應用程式中啟用已歸檔資料的程式設計存取權。這些資料查詢可自動化業務流程、支援第三方系統整合、建立自訂檢視和報告,以及與已啟用記錄交叉參照已歸檔資料。
「封存」元件和「封存搜尋」可提供手動取用資料的選項。Apex 提供進階功能,例如查詢參數、篩選條件和分頁,可透過程式碼直接存取資料。
Apex 資料查詢功能包括:
- 使用指定的條件搜尋已歸檔記錄。
- 使用部分比對與星號 (*)。
- 以每頁最多 1,000 筆記錄的批次傳回大型資料集。
- 套用最多六個篩選條件以限定您的結果。
- 查詢已歸檔記錄,即使物件已從您的生產組織中刪除。
系統相關的這些 Salesforce 物件會篩選出,且無法透過 Apex 搜尋。
FeedHistoryRelationShare
為了維持最佳效能並確保僅傳回相關的歸檔資料,「封存」會從搜尋中排除這些物件。
若要存取已歸檔檔案,請使用「歸檔」元件或「歸檔搜尋」。
封存 Apex 會強制執行這些要求限制。
| 間隔 | 要求限制 |
|---|---|
| 每分鐘 | 1000 |
| 每小時 | 30,000 |
| 每天 | 100,000 |
如果您超過此限制,您會收到 HTTP 狀態代碼 429。
封存 Apex 資料查詢方法
若要定義查詢歸檔資料的方式,請設定封存 Apex 所提供的方法。
- 存取歸檔資料—
ArchiverAccessor中的方法設計為與已歸檔記錄互動。接著,您可以建立查詢,並取回儲存在「封存」產品中的資料。 - 定義查詢作業—這些簽章會告知您可以使用 Apex 執行的查詢類型,例如全域搜尋和篩選的查詢。
- 指引用量—透過檢查方法簽章,開發人員可以瞭解實作所需的輸入與輸出。
performArchiverGlobalSearch 方法
此方法表示可對已歸檔資料執行全域搜尋的功能。
Query 參數
Apex 資料查詢使用數個參數來限定搜尋。有些參數是必要的,有些則是選擇性的。瞭解如何設定每個參數,可協助您取得最準確且相關的結果。
- 物件名稱—指定要查詢的 Salesforce 物件類型。
例如,
string sObjectName = 'Account'指定查詢鎖定「帳戶」記錄的目標。此參數是必要的。
備註 每個查詢目標為單一物件。使用個別查詢從多個物件中提取資料。 - 搜尋篩選條件—根據欄位條件縮小搜尋結果範圍的篩選條件。
- 欄位名稱—您要篩選依據的欄位,例如
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'});此查詢會傳回「狀態」欄位符合字串「未結束」或「已結束」的記錄。
處理空白或空值—若要搜尋欄位為空白或空值的記錄,請將空白字串 ("") 新增至「值清單」。範例:
此查詢會傳回「主旨」欄位為空白或空值的「個案」記錄。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);此查詢會傳回 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 個記錄會觸發執行階段錯誤。 - 排序方向—依欄位 (例如
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 支援並取得詳細的記錄。
如需逐步測試程序,請參閱 封存 Apex 測試。
- 歸檔 Apex 資料查詢—程式碼範例
在此程式碼範例中,會透過「封存」應用程式中的狀態代碼驗證篩選條件、日期範圍和封存搜尋要求。 - 歸檔 Apex 資料查詢—範例使用個案 1
此範例使用個案顯示如何建立和自訂在「封存」應用程式中顯示「高優先順序帳戶」的元件。 - 歸檔 Apex 資料查詢—使用個案範例 2
此範例使用個案顯示「歸檔 Apex」如何在「歸檔」應用程式中處理工作,而不超過管理員限制,例如 CPU 限制或逾時呼叫。
歸檔 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
此範例使用個案顯示如何建立和自訂在「封存」應用程式中顯示「高優先順序帳戶」的元件。
使用個案
您的業務需要「層級 3 支援小組」擁有存取權,才能檢視具有高優先順序狀態的已歸檔個案。
此範例顯示如何:
- 建立自訂 Lightning Web 元件 (LWC)。
- 使用 Apex 資料查詢提取歸檔的資料。
- 套用篩選條件 (高優先順序)。備註 其他篩選條件可以透過參照「歸檔 Apex 資料查詢 — 程式碼範例」中的程式碼來進行自訂。
此範例限制為 25 個記錄。Apex 可讓您設定每頁 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);這是封存 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
此範例使用個案顯示「歸檔 Apex」如何在「歸檔」應用程式中處理工作,而不超過管理員限制,例如 CPU 限制或逾時呼叫。
如需詳細資訊,請參閱 Apex 管理員限制。
使用個案
您的業務需要「層級 3 支援小組」擁有存取權,才能檢視具有高優先順序狀態的已歸檔個案。
此範例顯示如何在透過 Apex 已封存記錄的數目過多時解決錯誤。錯誤如下所示:SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
來自這些 Apex 類別的程式碼會建立此使用個案。
ArchiveSecondPageJob 類別會使用捲動識別碼從「封存」處理分頁資料,並視需要進行呼叫。其會透過 Queueable 介面以非同步方式執行,追蹤總執行時間以避免超過限制,並視需要將自身列入繼續處理。類別會處理回應、更新捲動識別碼,並記錄有關每個採取資料頁面的詳細資料。
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 開發人員指南。

