Vous êtes ici :
Archiver des requêtes de données Apex
Archiver les requêtes de données Apex permet d'accéder par programmation aux données archivées dans l'application Archive. Ces requêtes de données automatisent les processus métiers, prennent en charge les intégrations système tierces, créent des vues et des rapports personnalisés, et croisent les données archivées avec des enregistrements actifs.
Le composant Archiver et la Recherche d'archives offrent des options de récupération manuelle des données. Apex offre des capacités avancées, telles que les paramètres de requête, les filtres et la pagination, pour un accès direct aux données via un code.
Les fonctionnalités Requêtes de données Apex comprennent :
- Recherchez des enregistrements archivés en utilisant des critères spécifiés.
- Utilisez la correspondance partielle avec un astérisque (*).
- Renvoyez des jeux de données volumineux par lots contenant jusqu'à 1000 enregistrements par page.
- Appliquez jusqu'à six filtres pour affiner vos résultats.
- Interrogez les enregistrements archivés même si l'objet a été supprimé de votre organisation de production.
Ces objets Salesforce associés au système sont exclus et ne peuvent pas être recherchés via Apex
FeedHistoryRelationShare
Pour maintenir des performances optimales et s'assurer que seules les données archivées pertinentes sont renvoyées, Archive exclut ces objets des recherches.
Pour accéder aux fichiers archivés, utilisez le composant Archiver ou la Recherche d'archives.
Archive Apex applique ces limites en requêtes.
| Intervalle | Limite en requêtes |
|---|---|
| Par minute | 1000 |
| Par heure | 30 000 |
| Par jour | 100 000 |
Si vous dépassez cette limite, vous recevez le code de statut HTTP 429.
Archiver les méthodes de requête de données Apex
Pour définir comment vous interrogez les données archivées, définissez la méthode fournie par Apex Archive.
- Accès aux données d'archives : les méthodes de
ArchiverAccessorsont conçues pour interagir avec des enregistrements archivés. Vous pouvez ensuite élaborer des requêtes et récupérer des données stockées dans le produit Archive. - Définition des opérations de requête : ces signatures indiquent les types de requête que vous pouvez exécuter en utilisant Apex, par exemple les recherches globales et les requêtes filtrées.
- Guide d'utilisation : en examinant les signatures de méthode, les développeurs peuvent comprendre les entrées et les sorties requises pour leurs implémentations.
performArchiverGlobalSearch Méthode
Cette méthode indique la fonctionnalité permettant d'effectuer une recherche globale sur les données archivées.
Paramètres de Query
Les requêtes de données Apex utilisent plusieurs paramètres pour affiner votre recherche. Certains paramètres sont obligatoires et d'autres facultatifs. Comprendre comment configurer chaque paramètre permet d'obtenir des résultats plus précis et pertinents.
- Nom de l'objet : spécifie le type d'objet Salesforce à interroger.
Par exemple,
string sObjectName = 'Account'spécifie que la requête cible les enregistrements Compte.Ce paramètre est obligatoire.
Remarque Chaque requête cible un objet unique. Utilisez des requêtes séparées pour récupérer les données de plusieurs objets. - Filtres de recherche : filtres qui affinent les résultats de recherche en fonction des conditions de champ.
- Nom du champ : le champ par lequel vous souhaitez filtrer, par exemple
NameouCreatedDate - Valeur ou liste de valeurs : la ou les valeurs spécifiques que vous souhaitez mapper
Exemple : Filtre à valeur unique
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');Cette requête renvoie les enregistrements dans lesquels le champ Nom correspond à la chaîne "test".
Exemple : Filtre à valeurs multiplesSF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});Cette requête renvoie les enregistrements dans lesquels le champ Statut correspond aux chaînes « Ouvert » ou « Fermé ».
Traitement des valeurs vides ou nulles : pour rechercher des enregistrements dans lesquels un champ est vide ou nul, ajoutez une chaîne vide ("") à la Liste des valeurs.Exemple :
Cette requête renvoie les enregistrements Requête dans lesquels le champ Objet est vide ou nul.List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));Limites en filtres de recherche :
- Les requêtes nécessitent au moins 1 filtre par requête.
- Les requêtes peuvent avoir jusqu'à 6 filtres, combinés à une logique de
AND, par requête. - Les filtres sont combinés par défaut en utilisant une logique de
AND. Actuellement, la logique deORn'est pas prise en charge. - La liste de valeurs d'un filtre ne peut pas dépasser 1000 éléments.
Ce paramètre est obligatoire.
- Nom du champ : le champ par lequel vous souhaitez filtrer, par exemple
- Filtres de date : pour rechercher par date, utilisez le paramètre
DateRangeet les filtres obligatoires.DateRangefiltre les enregistrements par des champs tels queArchiveDate,CreatedDateouModifiedDate.Exemple : Filtre de date pour une requête de date spécifique
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);Cette requête renvoie les enregistrements archivés entre le 1er janvier 2024 et aujourd'hui.
Exemple : Filtre de date pour plusieurs plages de dates
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);Cette requête renvoie les enregistrements archivés entre le 12 décembre 2023 et le 11 janvier 2024.
Recommandations de filtres de date :
- Pour effectuer une recherche basée sur la Date d'archivage, ajoutez le champ de date de
archive_date. - Utilisez le format de date Apex : MM/JJ/AAAA.
Ce paramètre est facultatif.
- Pour effectuer une recherche basée sur la Date d'archivage, ajoutez le champ de date de
- Champs renvoyés : spécifiez les champs à inclure dans les résultats. S'ils ne sont pas spécifiés, tous les champs sont renvoyés.
Exemple : Renvoyer des champs spécifiques
List<string> fields = new List<string>{'Name', 'CreatedDate'};Cette requête renvoie uniquement les champs
NameetCreatedDatede chaque enregistrement.Ce paramètre est facultatif.
- Taille de page : définit le nombre d'enregistrements par requête. Le nombre d'enregistrements par défaut par requête est de 25 et le nombre maximal est de 1000.
Exemple : Taille de page personnalisée
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);Cette requête renvoie 100 enregistrements par page.
Ce paramètre est facultatif.Remarque Le dépassement de 1000 enregistrements dans votre requête déclenche une erreur à l'exécution. - Direction de tri : trie les résultats par un champ, par exemple
CreatedDate.- Croissant (
asc) : Du plus ancien au plus récent. - Descendant (
desc) : Du plus récent au plus ancien.Exemple : Requête de tri
SortingDirection sortingDirection = new SortingDirection('desc');Cette requête renvoie les enregistrements triés par ordre décroissant de
CreatedDate.Ce paramètre est facultatif.
- Croissant (
getNextPage Méthode
Si les résultats ne correspondent pas tous à la même page, cette méthode appelle la page suivante.
Paramètre ScrollId
Utilisez la pagination pour renvoyer des jeux de données volumineux en récupérant les résultats dans des pages contenant jusqu'à 1000 enregistrements.
Pour configurer le workflow de pagination, exécutez la requête initiale, utilisez les scrollId de la réponse pour récupérer les pages suivantes, puis continuez jusqu'à la scrollId = '-1'..
Exemple : Récupération des résultats avec la pagination
// 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);
}Accès aux méthodes
Pour retrouver les signatures de méthode, dans Configuration, saisissez Classes Apex dans la case Recherche rapide, puis sélectionnez Classes Apex. Ouvrez la classe ArchiverAccessor. Localisez toutes les méthodes répertoriées sous l'espace de noms performArchiverGlobalSearch.
Exemple de requête de données
Cet exemple récupère des enregistrements Account en utilisant les conditions ci-dessous.
- Champs :
Name,CreatedDate - Limite : 100 enregistrements par page
- Nom : Contient la chaîne "test"
- Tri : Décroissant par
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);
Dépannage des erreurs courantes
| Code d'erreur | Description | Résolution |
|---|---|---|
INTERNAL_ERROR |
Un échec inattendu s'est produit. | Contactez le support avec des détails d'erreur. |
RESOURCE_LIMIT_ERROR |
Dépassement des limites en taille de pagination ou de requête. | Réduisez la taille de page ou affinez les filtres de recherche. |
VALIDATION_ERROR |
Critères de recherche manquants ou non valides. | Assurez-vous que tous les champs et filtres sont valides. |
Recommandations supplémentaires
- Surveillez votre utilisation de l'API pour éviter d'atteindre les limites.
- Pour envoyer la réponse à un objet, sérialisez-la en JSON, puis désérialisez-la en un objet.
- Vérifiez que les champs sont activés et accessibles.
- Vérifiez tous les paramètres de requête.
- Pour les problèmes non résolus, contactez le Support Salesforce avec des journaux détaillés.
Pour les procédures de test étape par étape, voir Archivage des tests Apex.
- Archiver des requêtes de données Apex : exemple de code
Dans cet exemple de code, un filtre, une plage de dates et une requête de recherche d'archives sont validés via le code de statut dans l'application Archive. - Archiver des requêtes de données Apex : exemple de cas d'utilisation 1
Cet exemple de cas d'utilisation montre comment élaborer et personnaliser un composant qui affiche Comptes prioritaires dans l'application Archive. - Archiver des requêtes de données Apex : exemple de cas d'utilisation 2
Cet exemple de cas d'utilisation montre comment Archive Apex gère les tâches sans dépasser les limites du gouverneur, telles que les limites en processeur ou les appels externes d'expiration, dans l'application Archive.
Archiver des requêtes de données Apex : exemple de code
Dans cet exemple de code, un filtre, une plage de dates et une requête de recherche d'archives sont validés via le code de statut dans l'application Archive.
Un appel getNextPage suivant un (scrollId != -1) est inclus, car la taille des résultats est limitée dans l'appel 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());
}Archiver des requêtes de données Apex : exemple de cas d'utilisation 1
Cet exemple de cas d'utilisation montre comment élaborer et personnaliser un composant qui affiche Comptes prioritaires dans l'application Archive.
Cas d'utilisation
Votre activité nécessite que l'équipe de support de niveau 3 ait accès à l'affichage des requêtes archivées avec un statut de priorité élevée.
Cet exemple montre comment :
- Créez un composant Web Lightning (LWC) personnalisé.
- Extrayez les données archivées en utilisant des requêtes de données Apex.
- Appliquez le filtre (Priorité élevée). Remarque D'autres filtres peuvent être personnalisés en référence au code dans Archiver les requêtes de données Apex — Exemple de code.
Cet exemple est limité à 25 enregistrements. Apex permet de définir les résultats à 1000 par page. La valeur par défaut est 25, avec l'option de pagination dans les résultats.
Composant affichant les requêtes prioritaires
Exemple de SdkUseCaseWidget.js
Dans cet exemple de code, le paramètre est 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;
}}
} Exemple de SdkUseCaseWidget.html
Le contrôleur Apex que le LWC utilise appelle Requêtes de données Apex.
SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);C'est l'appel pour Apex Archive. Il inclut les paramètres ci-dessous.
- sObjectName : affiche la recherche
- Filtres : utilisés pour récupérer les données
- Champs : les champs projetés à renvoyer à partir de données.
- Plage : plage de dates utilisée pour interroger les données.
<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
Ce bloc de code est le contrôleur 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 pour formuler la classe de 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;
}}Le code ci-dessus décrit un exemple de scénario dans lequel vous pouvez ajouter LWC en tant que composant à la page Lightning.
Pour afficher le tableau de données Lightning réel, ajoutez ce code au fichier sampleSdkUseCaseWidget.js-meta.xml. Ajoutez ensuite le composant Archive à la page 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>Archiver des requêtes de données Apex : exemple de cas d'utilisation 2
Cet exemple de cas d'utilisation montre comment Archive Apex gère les tâches sans dépasser les limites du gouverneur, telles que les limites en processeur ou les appels externes d'expiration, dans l'application Archive.
Pour plus d'informations, voir Apex Governor Limits.
Cas d'utilisation
Votre activité nécessite que l'équipe de support de niveau 3 ait accès à l'affichage des requêtes archivées avec un statut de priorité élevée.
Cet exemple montre comment contourner une erreur lorsque le nombre d'enregistrements archivés récupérés via Apex est trop important. L'erreur indique : SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
Le code de ces classes Apex crée ce cas d'utilisation.
La classe ArchiveSecondPageJob traite les données paginées depuis Archive en utilisant un ID de défilement, en passant des appels externes si nécessaire. Il est exécuté de façon asynchrone via l'interface Queueable, en suivant le temps d'exécution total pour éviter de dépasser les limites et en se mettant en file d'attente pour poursuivre le traitement si nécessaire. La classe gère les réponses, met à jour l'ID de défilement et consigne les détails de chaque page de données récupérée.
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 effectue une recherche dans l'objet Requête en utilisant des filtres spécifiques, récupère les résultats et consigne les détails tels que le nombre total et l'ID de défilement. Si la recherche renvoie un ID de défilement valide, indiquant plus de pages de résultats, elle met en file d'archiveSecondPageJob pour traiter la page suivante de façon asynchrone. Cette classe initie essentiellement la recherche et transmet le traitement ultérieur à la archiveSecondPageJob précédemment définie.
Voici le format de l'appel de recherche initial.
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);
}}}}Pour plus d'informations, consultez Salesforce Apex Developer Guide (en anglais).

