U bent hier:
Apex gegevensquery's archiveren
Apex gegevensquery's archiveren schakelt programmatische toegang tot gearchiveerde gegevens in de app Archiveren in. Deze gegevensquery's automatiseren bedrijfsprocessen, ondersteunen externe systeemintegraties, maken aangepaste weergaven en rapporten, en maken kruisverwijzingen naar gearchiveerde gegevens met actieve records.
De component Archiveren en Zoeken in archiveren bieden opties voor het handmatig ophalen van gegevens. Apex biedt geavanceerde mogelijkheden, zoals queryparameters, filters en paginering, voor directe toegang tot gegevens via code.
Apex gegevensquery's omvatten:
- Zoek in gearchiveerde records met behulp van opgegeven criteria.
- Gebruik gedeeltelijke overeenkomsten met een asterisk (*).
- Retourneer grote gegevenssets in batches van maximaal 1000 records per pagina.
- Pas maximaal zes filters toe om uw resultaten te verfijnen.
- Voer een query uit op gearchiveerde records, zelfs als het object is verwijderd uit uw productieorganisatie.
Deze aan het systeem gerelateerde Salesforce-objecten worden uitgefilterd en zijn niet doorzoekbaar via Apex.
FeedHistoryRelationShare
Om optimale prestaties te behouden en ervoor te zorgen dat alleen relevante gearchiveerde gegevens worden geretourneerd, sluit Archiveren deze objecten uit van zoekopdrachten.
Gebruik voor toegang tot gearchiveerde bestanden de component Archiveren of Zoeken in archief.
Apex archiveren dwingt deze verzoeklimieten af.
| Interval | Verzoeklimiet |
|---|---|
| Per minuut | 1000 |
| Per uur | 30.000 |
| Per dag | 100.000 |
Als u deze limiet overschrijdt, ontvangt u HTTP-statuscode 429.
Apex gegevensquerymethoden archiveren
Stel voor het definiëren van de manier waarop u een query uitvoert op gearchiveerde gegevens, de methode in die wordt geboden door Apex archiveren.
- Toegang tot archiefgegevens—De methoden binnen
ArchiverAccessorzijn ontworpen voor interactie met gearchiveerde records. Vervolgens kunt u query's samenstellen en gegevens ophalen die zijn opgeslagen in het product Archiveren. - Querybewerkingen definiëren—Deze handtekeningen vertellen u welke soorten query's u kunt uitvoeren met behulp van Apex, zoals globale zoekopdrachten en gefilterde query's.
- Gebruik begeleiden—Door methodehandtekeningen te onderzoeken kunnen ontwikkelaars inzicht krijgen in de invoer en uitvoer die vereist zijn voor hun implementaties.
performArchiverGlobalSearch Methode
Deze methode geeft de functionaliteit aan voor het uitvoeren van een globale zoekopdracht op gearchiveerde gegevens.
Query Parameters
Apex gegevensquery's gebruiken verschillende parameters om uw zoekopdracht te verfijnen. Sommige parameters zijn verplicht, terwijl andere optioneel zijn. Inzicht in de manier waarop u elke parameter configureert, helpt u de meest nauwkeurige en relevante resultaten te verkrijgen.
- Objectnaam—Geeft het type Salesforce-object aan waarop een query moet worden uitgevoerd.
string sObjectName = 'Account'geeft bijvoorbeeld aan dat de query is gericht op Accountrecords.Deze parameter is verplicht.
Opmerking Elke query is gericht op één object. Gebruik afzonderlijke query's om gegevens op te halen uit meerdere objecten. - Zoekfilters: filters die zoekresultaten verfijnen op basis van veldvoorwaarden.
- Veldnaam: het veld waarop u wilt filteren, zoals
NameofCreatedDate - Waarde of Lijst van waarden—De specifieke waarde of waarden die u wilt vergelijken
Voorbeeld: Filter met enkelvoudige waarde
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');Deze query retourneert records waarbij het veld Naam overeenkomt met de tekenreeks "test".
Voorbeeld: Filter met meerdere waardenSF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});Deze query retourneert records waarbij het veld Status overeenkomt met de tekenreeksen "Open" of "Gesloten".
Omgaan met lege of null-waarden—Als u wilt zoeken naar records waarin een veld leeg of null is, voegt u een lege tekenreeks ("") toe aan de Lijst van waarden.Voorbeeld:
Deze query retourneert caserecords waarbij het veld Onderwerp leeg of null is.List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));Zoekfilterlimieten:
- Query's vereisen minstens 1 filter per query.
- Query's kunnen maximaal 6 filters hebben, gecombineerd met
AND, per query. - Filters worden standaard gecombineerd met behulp van
AND.ORwordt momenteel niet ondersteund. - De waardenlijst van een filter mag niet meer dan 1000 items bevatten.
Deze parameter is verplicht.
- Veldnaam: het veld waarop u wilt filteren, zoals
- Datumfilters—Gebruik voor zoeken op basis van datums de parameter
DateRangeen de verplichte filters.DateRangefiltert records op velden zoalsArchiveDate,CreatedDateofModifiedDate.Voorbeeld: Datumfilter voor specifieke datumquery
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);Deze query retourneert records die zijn gearchiveerd tussen 1 januari 2024 en vandaag.
Voorbeeld: Datumfilter voor meerdere datumbereiken
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);Deze query retourneert records die zijn gearchiveerd tussen 12 december 2023 en 11 januari 2024.
Aanbevelingen voor datumfilters:
- Voeg voor zoeken op basis van Archiveringsdatum het veld
archive_datetoe. - Gebruik de Apex datumnotatie: MM/DD/JJJJ.
Deze parameter is optioneel.
- Voeg voor zoeken op basis van Archiveringsdatum het veld
- Geretourneerde velden—Geef velden op die in de resultaten moeten worden opgenomen. Indien niet opgegeven, worden alle velden geretourneerd.
Voorbeeld: Specifieke velden retourneren
List<string> fields = new List<string>{'Name', 'CreatedDate'};Deze query retourneert alleen de
NameenCreatedDatevoor elke record.Deze parameter is optioneel.
- Paginagrootte: stelt het aantal records per query in. Het standaardaantal records per query is 25 en het maximum is 1000.
Voorbeeld: Aangepaste paginagrootte
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);Deze query retourneert 100 records per pagina.
Deze parameter is optioneel.Opmerking Overschrijding van 1000 records in uw query activeert een run-time fout. - Sorteerrichting: sorteert resultaten op een veld, zoals
CreatedDate.- Oplopend (
asc): Oudste naar nieuwste. - Aflopend (
desc): Nieuwste naar oudste.Voorbeeld: Sorteerquery
SortingDirection sortingDirection = new SortingDirection('desc');Deze query retourneert records gesorteerd in aflopende volgorde op basis van hun
CreatedDate.Deze parameter is optioneel.
- Oplopend (
getNextPage Methode
Als de resultaten niet allemaal op dezelfde pagina passen, roept deze methode de volgende pagina aan.
ScrollId Parameter
Gebruik paginering om grote gegevenssets te retourneren door resultaten op te halen op pagina's van maximaal 1000 records.
Voer voor het instellen van de pagineringswerkstroom de initiële query uit, gebruik de scrollId uit de respons om volgende pagina's op te halen en ga door tot aan de scrollId = '-1'..
Voorbeeld: Resultaten ophalen met paginering
// 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);
}Toegang tot de methoden
Geef voor het zoeken van de methodehandtekeningen vanuit Set-up Apex klassen op in het vak Snel zoeken en selecteer vervolgens Apex klassen. Open de ArchiverAccessor. Zoek alle methoden die worden vermeld onder de naamruimte performArchiverGlobalSearch.
Voorbeeld van gegevensquery
In dit voorbeeld worden Account opgehaald met behulp van deze voorwaarden.
- Velden:
Name,CreatedDate - Limiet: 100 records per pagina
- Naam: Bevat de tekenreeks "test"
- Sorteren: Aflopend op
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);
Veel voorkomende fouten oplossen
| Foutcode | Beschrijving | Oplossing |
|---|---|---|
INTERNAL_ERROR |
Er heeft zich een onverwachte fout voorgedaan. | Neem contact op met de ondersteuning met foutdetails. |
RESOURCE_LIMIT_ERROR |
Limieten voor paginering of querygrootte overschreden. | Verklein de paginagrootte of verfijn zoekfilters. |
VALIDATION_ERROR |
Ontbrekende of ongeldige zoekcriteria. | Zorg ervoor dat alle velden en filters geldig zijn. |
Aanvullende aanbevelingen
- Bewaak uw API-gebruik om te voorkomen dat u limieten bereikt.
- Als u de respons op een object wilt casten, serialiseert u het in JSON en deserialiseert u het vervolgens weer in een object.
- Controleer of velden zijn ingeschakeld en toegankelijk zijn.
- Controleer alle queryparameters.
- Voor onopgeloste problemen neemt u contact op met de ondersteuning van Salesforce met gedetailleerde logboeken.
Zie Apex testen archiveren voor stapsgewijze testprocedures.
- Apex gegevensquery's archiveren—Codevoorbeeld
In dit codevoorbeeld worden een filter, een datumbereik en een zoekopdracht in een archief gevalideerd via de statuscode in de app Archiveren. - Apex gegevensquery's archiveren—Voorbeeld van gebruikscase 1
Dit voorbeeld van een gebruikscase toont hoe u een component samenstelt en aanpast die accounts met hoge prioriteit weergeeft in de app Archiveren. - Apex gegevensquery's archiveren—Voorbeeld van gebruikscase 2
Dit voorbeeld van een gebruikscase toont hoe Apex taken archiveert zonder beheerlimieten te overschrijden, zoals CPU-limieten of Time-out-aanroepen, in de app Archiveren.
Apex gegevensquery's archiveren—Codevoorbeeld
In dit codevoorbeeld worden een filter, een datumbereik en een zoekopdracht in een archief gevalideerd via de statuscode in de app Archiveren.
Een getNextPage na (scrollId != -1) is inbegrepen, omdat de grootte van de resultaten beperkt is in het 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 gegevensquery's archiveren—Voorbeeld van gebruikscase 1
Dit voorbeeld van een gebruikscase toont hoe u een component samenstelt en aanpast die accounts met hoge prioriteit weergeeft in de app Archiveren.
Gebruikscase
Uw bedrijf vereist dat het ondersteuningsteam van Laag 3 toegang heeft om gearchiveerde cases met een status met hoge prioriteit weer te geven.
In dit voorbeeld ziet u hoe u:
- Maak een aangepaste Lightning Web Component (LWC).
- Haal gearchiveerde gegevens op met behulp van Apex gegevensquery's.
- Pas het filter toe (Hoge prioriteit). Opmerking Andere filters kunnen worden aangepast door te verwijzen naar de code in Apex gegevensquery's archiveren — Codevoorbeeld.
Dit voorbeeld is beperkt tot 25 records. Met Apex kunt u de resultaten instellen op 1000 per pagina. De standaardinstelling is 25, met de optie van paginering door de resultaten.
Component Cases met hoge prioriteit weergeven
Voorbeeld van SdkUseCaseWidget.js
In dit codevoorbeeld is de parameter 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;
}}
} Voorbeeld van SdkUseCaseWidget.html
De Apex controller die de LWC gebruikt roept Apex Data Queries aan.
SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);Dit is de oproep voor Apex archiveren. Het omvat deze parameters.
- sObjectName—Geeft de zoekopdracht weer
- Filters: gebruikt om de gegevens op te halen
- Velden: de geprojecteerde velden die moeten worden geretourneerd vanuit gegevens.
- Bereik: het datumbereik dat wordt gebruikt voor het uitvoeren van een query op de gegevens.
<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
Dit codeblok is de Apex controller.
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
Helperklasse voor het formuleren van klasse van Apex naar 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;
}}De bovenstaande code beschrijft een voorbeeldscenario waarbij u LWC als component kunt toevoegen aan de Lightning pagina.
Voeg voor het weergeven van de feitelijke Lightning gegevenstabel deze code toe aan het sampleSdkUseCaseWidget.js-meta.xml. Voeg vervolgens de component Archiveren toe aan de Lightning pagina.
<?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 gegevensquery's archiveren—Voorbeeld van gebruikscase 2
Dit voorbeeld van een gebruikscase toont hoe Apex taken archiveert zonder beheerlimieten te overschrijden, zoals CPU-limieten of Time-out-aanroepen, in de app Archiveren.
Zie Apex Governor Limits voor meer informatie.
Gebruikscase
Uw bedrijf vereist dat het ondersteuningsteam van Laag 3 toegang heeft om gearchiveerde cases met een status met hoge prioriteit weer te geven.
Dit voorbeeld toont hoe u een fout kunt omzeilen wanneer het aantal gearchiveerde records dat via Apex wordt opgehaald, te groot is. De fout luidt: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
Code uit deze Apex klassen maakt deze gebruikscase.
De ArchiveSecondPageJob verwerkt gepagineerde gegevens uit Archiveren met behulp van een scrol-ID, waarbij indien nodig aanroepen worden gedaan. Deze wordt asynchroon uitgevoerd via de interface Wachtrijbaar, waarbij de totale uitvoeringstijd wordt bijgehouden om overschrijding van limieten te voorkomen en zichzelf indien nodig in een wachtrij wordt geplaatst voor verdere verwerking. De klasse verwerkt responsen, werkt de scroll-ID bij en legt details vast over elke opgehaalde gegevenspagina.
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;
}
}
}
}
De klasse ArchiveSearch voert een zoekopdracht uit op het object Case met behulp van specifieke filters, haalt de resultaten op en registreert details zoals de totale telling en de scroll-ID. Als de zoekopdracht een geldige scrol-ID retourneert, hetgeen meer pagina's met resultaten aangeeft, plaatst deze de archiveSecondPageJob in de wachtrij om de volgende pagina asynchroon te verwerken. Deze klasse initieert in wezen de zoekopdracht en geeft verdere verwerking door aan de eerder gedefinieerde archiveSecondPageJob.
Hier is de indeling voor het initiële zoekgesprek.
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);
}}}}Zie Salesforce Apex Developer Guide voor meer informatie.

