Ti trovi qui:
Archiviazione di query sui dati Apex
Archivia query sui dati Apex abilita l'accesso a livello di programmazione ai dati archiviati nell'app Archivia. Queste query sui dati automatizzano i processi aziendali, supportano integrazioni di sistemi di terze parti, creano visualizzazioni e rapporti personalizzati e incrociano i dati archiviati con i record attivi.
Il componente Archivia e la ricerca Archivia offrono opzioni per il recupero manuale dei dati. Apex offre funzionalità avanzate, ad esempio parametri di query, filtri e paginazione, per l'accesso diretto ai dati tramite codice.
Le funzioni delle query dati Apex includono:
- Cercare i record archiviati utilizzando i criteri specificati.
- Utilizzare la corrispondenza parziale con un asterisco (*).
- Restituire serie di dati di grandi dimensioni in batch di un massimo di 1.000 record per pagina.
- Applicare fino a sei filtri per perfezionare i risultati.
- Eseguire una query sui record archiviati anche se l'oggetto è stato eliminato dall'organizzazione di produzione.
Questi oggetti Salesforce correlati al sistema sono esclusi e non sono ricercabili tramite Apex.
FeedHistoryRelationShare
Per mantenere prestazioni ottimali e assicurarsi che vengano restituiti solo i dati archiviati pertinenti, Archivia esclude questi oggetti dalle ricerche.
Per accedere ai file archiviati, utilizzare il componente Archivia o la ricerca Archivia.
Archivia Apex impone i seguenti limiti di richiesta.
| Intervallo | Limite richieste |
|---|---|
| Al minuto | 1000 |
| All'ora | 30.000 |
| Al giorno | 100.000 |
Se si supera questo limite, si riceve il codice di stato HTTP 429.
Archiviazione dei metodi di query Apex Data
Per definire il modo in cui si eseguono query sui dati archiviati, impostare il metodo fornito da Archivia Apex.
- Accesso ai dati di archiviazione: i metodi di
ArchiverAccessorsono progettati per interagire con i record archiviati. Quindi è possibile creare query e recuperare i dati memorizzati nel prodotto Archivia. - Definizione delle operazioni di query: queste firme indicano quali tipi di query è possibile eseguire utilizzando Apex, ad esempio ricerche globali e query filtrate.
- Guida all'utilizzo: esaminando le firme dei metodi, gli sviluppatori possono comprendere gli input e gli output necessari per le loro implementazioni.
Metodo performArchiverGlobalSearch
Questo metodo indica la funzionalità per eseguire una ricerca globale sui dati archiviati.
Parametri di Query
Le query dati Apex utilizzano diversi parametri per perfezionare la ricerca. Alcuni parametri sono obbligatori, mentre altri sono facoltativi. Sapere come configurare ogni parametro consente di ottenere i risultati più precisi e pertinenti.
- Nome oggetto: specifica il tipo di oggetto Salesforce da sottoporre a query.
Ad esempio,
string sObjectName = 'Account'specifica che la query è destinata ai record Account.Questo parametro è obbligatorio.
Nota Ogni query è destinata a un singolo oggetto. Utilizzare query separate per recuperare i dati da più oggetti. - Filtri di ricerca: filtri che restringono i risultati della ricerca in base alle condizioni dei campi.
- Nome campo: il campo in base al quale si desidera filtrare, ad esempio
NameoCreatedDate - Valore o elenco di valori: il valore o i valori specifici che si desidera abbinare
Esempio: Filtro a valore singolo
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');Questa query restituisce i record in cui il campo Nome corrisponde alla stringa "test".
Esempio: Filtro valori multipliSF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});Questa query restituisce i record in cui il campo Stato corrisponde alle stringhe "Aperto" o "Chiuso".
Gestione dei valori vuoti o nulli: per cercare i record in cui un campo è vuoto o nullo, aggiungere una stringa vuota ("") all'elenco dei valori.Esempio:
Questa query restituisce i record Caso in cui il campo Oggetto è vuoto o nullo.List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));Limiti dei filtri di ricerca:
- Le query richiedono almeno 1 filtro per query.
- Le query possono avere un massimo di 6 filtri, combinati con la logica di
AND, per query. - I filtri vengono combinati utilizzando la logica di
ANDper impostazione predefinita. La logica diORnon è attualmente supportata. - L'elenco dei valori di un filtro non può superare 1.000 elementi.
Questo parametro è obbligatorio.
- Nome campo: il campo in base al quale si desidera filtrare, ad esempio
- Filtri data: per eseguire la ricerca in base alle date, utilizzare il parametro
DateRangee i filtri obbligatori.DateRangefiltra i record in base a campi comeArchiveDate,CreatedDateoModifiedDate.Esempio: Filtro data per query data specifica
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);Questa query restituisce i record archiviati tra il 1° gennaio 2024 e la data odierna.
Esempio: Filtro data per più intervalli di date
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);Questa query restituisce i record archiviati tra il 12 dicembre 2023 e l'11 gennaio 2024.
Consigli sui filtri data:
- Per eseguire la ricerca in base alla Data archiviazione, aggiungere il campo Data
archive_date. - Utilizzare il formato di data Apex: MM/GG/AAAA.
Questo parametro è facoltativo.
- Per eseguire la ricerca in base alla Data archiviazione, aggiungere il campo Data
- Campi restituiti: specificare i campi da includere nei risultati. Se non specificato, vengono restituiti tutti i campi.
Esempio: Restituisci campi specifici
List<string> fields = new List<string>{'Name', 'CreatedDate'};Questa query restituisce solo i campi
NameeCreatedDateper ogni record.Questo parametro è facoltativo.
- Dimensioni pagina: imposta il numero di record per query. Il numero predefinito di record per query è 25 e il massimo è 1.000.
Esempio: Dimensioni pagina personalizzate
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);Questa query restituisce 100 record per pagina.
Questo parametro è facoltativo.Nota Il superamento di 1.000 record nella query attiva un errore in fase di esecuzione. - Direzione di ordinamento: ordina i risultati in base a un campo, ad esempio
CreatedDate.- Crescente (
asc): Dal più vecchio al più recente. - Decrescente (
desc): Dal più recente al più vecchio.Esempio: Query di ordinamento
SortingDirection sortingDirection = new SortingDirection('desc');Questa query restituisce i record ordinati in ordine decrescente in base al loro
CreatedDate.Questo parametro è facoltativo.
- Crescente (
Metodo getNextPage
Se i risultati non corrispondono tutti alla stessa pagina, questo metodo chiama la pagina successiva.
Parametro ScrollId
Utilizzare la paginazione per restituire serie di dati di grandi dimensioni recuperando i risultati in pagine con un massimo di 1.000 record.
Per impostare il flusso di lavoro di paginazione, eseguire la query iniziale, utilizzare le scrollId della risposta per recuperare le pagine successive e continuare fino a scrollId = '-1'..
Esempio: Recupero dei risultati con la paginazione
// 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);
}Accesso ai metodi
Per trovare le firme dei metodi, da Imposta immettere Classi Apex nella casella Ricerca veloce, quindi selezionare Classi Apex. Aprire la classe ArchiverAccessor. Individuare tutti i metodi elencati nello spazio dei nomi performArchiverGlobalSearch.
Esempio di query sui dati
Questo esempio recupera i record Account utilizzando le seguenti condizioni.
- Campi:
Name,CreatedDate - Limite: 100 record per pagina
- Nome: Contiene la stringa "test"
- Ordinamento: Decrescente per
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);
Risoluzione degli errori comuni
| Codice errore | Descrizione | Soluzione |
|---|---|---|
INTERNAL_ERROR |
Si è verificato un errore imprevisto. | Contattare l'assistenza con i dettagli dell'errore. |
RESOURCE_LIMIT_ERROR |
Superati i limiti di paginazione o di dimensione delle query. | Ridurre le dimensioni della pagina o perfezionare i filtri di ricerca. |
VALIDATION_ERROR |
Criteri di ricerca mancanti o non validi. | Assicurarsi che tutti i campi e i filtri siano validi. |
Consigli aggiuntivi
- Monitorare l'utilizzo dell'API per evitare di superare i limiti.
- Per inviare la risposta a un oggetto, serializzarla in JSON e quindi deserializzarla nuovamente in un oggetto.
- Verificare che i campi siano abilitati e accessibili.
- Ricontrollare tutti i parametri di query.
- Per problemi irrisolti, contattare l'Assistenza Salesforce con registri dettagliati.
Per le procedure di test passo per passo, vedere Archiviazione di Apex Testing.
- Archiviazione di query sui dati Apex: esempio di codice
In questo esempio di codice, un filtro, un intervallo di date e una richiesta di ricerca nell'archivio vengono convalidati tramite il codice di stato nell'app Archivia. - Archiviazione di query sui dati Apex — Esempio di caso d'uso 1
Questo esempio di caso d'uso mostra come creare e personalizzare un componente che visualizza Account con priorità alta nell'app Archivia. - Archiviazione di query sui dati Apex — Esempio di caso d'uso 2
Questo esempio di caso d'uso mostra come Archivia Apex gestisce le operazioni senza superare i limiti del governor, ad esempio i limiti della CPU o le chiamate di timeout, nell'app Archivia.
Archiviazione di query sui dati Apex: esempio di codice
In questo esempio di codice, un filtro, un intervallo di date e una richiesta di ricerca nell'archivio vengono convalidati tramite il codice di stato nell'app Archivia.
È inclusa una chiamata getNextPage dopo (scrollId != -1) perché le dimensioni dei risultati sono limitate nella chiamata 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());
}Archiviazione di query sui dati Apex — Esempio di caso d'uso 1
Questo esempio di caso d'uso mostra come creare e personalizzare un componente che visualizza Account con priorità alta nell'app Archivia.
Caso d'uso
L'azienda richiede che il team di assistenza di livello 3 disponga dell'accesso per visualizzare i casi archiviati con stato ad alta priorità.
Questo esempio mostra come:
- Creare un componente Web Lightning (LWC) personalizzato.
- Estrarre i dati archiviati utilizzando query sui dati Apex.
- Applicare il filtro (Alta priorità). Nota Altri filtri possono essere personalizzati con riferimento al codice in Archivia query Apex Data — Esempio di codice.
Questo esempio è limitato a 25 record. Apex consente di impostare i risultati su 1.000 per pagina. Il valore predefinito è 25, con l'opzione di paginazione attraverso i risultati.
Componente che visualizza casi con priorità alta
Esempio di SdkUseCaseWidget.js
In questo esempio di codice, il parametro è 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;
}}
} Esempio di SdkUseCaseWidget.html
Il controller Apex utilizzato da LWC chiama le query dati Apex.
SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);Questa è la chiamata per Archivia Apex. Include i seguenti parametri.
- sObjectName: rappresenta la ricerca
- Filtri: utilizzati per recuperare i dati
- Campi: i campi previsti da restituire dai dati.
- Intervallo: intervallo di date utilizzato per eseguire query sui dati.
<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
Questo blocco di codice è il controller 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
Classe Helper per formulare la classe da Apex a 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;
}}Il codice riportato sopra descrive uno scenario di esempio in cui è possibile aggiungere LWC come componente alla pagina Lightning.
Per visualizzare la tabella di dati Lightning effettiva, aggiungere questo codice al file sampleSdkUseCaseWidget.js-meta.xml. Aggiungere quindi il componente Archivia alla pagina 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>Archiviazione di query sui dati Apex — Esempio di caso d'uso 2
Questo esempio di caso d'uso mostra come Archivia Apex gestisce le operazioni senza superare i limiti del governor, ad esempio i limiti della CPU o le chiamate di timeout, nell'app Archivia.
Per ulteriori informazioni, vedere Apex Governor Limits.
Caso d'uso
L'azienda richiede che il team di assistenza di livello 3 disponga dell'accesso per visualizzare i casi archiviati con stato ad alta priorità.
Questo esempio mostra come risolvere un errore quando il numero di record archiviati recuperati tramite Apex è troppo elevato. L'errore è: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
Il codice di queste classi Apex crea questo caso d'uso.
La classe ArchiveSecondPageJob elabora i dati impaginati da Archivia utilizzando un ID scorrimento, effettuando chiamate in base alle esigenze. Viene eseguito in modo asincrono tramite l'interfaccia Area di attesa, monitorando il tempo totale di esecuzione per evitare di superare i limiti e l'area di attesa per continuare l'elaborazione se necessario. La classe gestisce le risposte, aggiorna l'ID scorrimento e registra i dettagli di ogni pagina di dati recuperata.
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;
}
}
}
}
La classe ArchiveSearch esegue una ricerca sull'oggetto Caso utilizzando filtri specifici, recupera i risultati e registra dettagli come il conteggio totale e l'ID scorrimento. Se la ricerca restituisce un ID scorrimento valido, che indica più pagine di risultati, l'area di attesa archiveSecondPageJob per elaborare la pagina successiva in modo asincrono. Questa classe avvia essenzialmente la ricerca e passa l'elaborazione successiva al archiveSecondPageJob definito in precedenza.
Di seguito è riportato il formato della chiamata di ricerca iniziale.
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);
}}}}Per ulteriori informazioni, vedere Salesforce Apex Developer Guide.

