Loading
Configuration et maintenance de votre organisation Salesforce
Table des matières
Sélectionner des filtres

          Aucun résultat
          Aucun résultat
          Voici quelques conseils de recherche

          Vérifiez l'orthographe de vos mots-clés.
          Utilisez des termes de recherche plus généraux.
          Sélectionnez moins de filtres pour élargir votre recherche.

          Recherchez dans toute l’aide de Salesforce
          Archiver des requêtes de données Apex

          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

          • Feed
          • History
          • Relation
          • Share

          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.

          Remarque
          Remarque Les fichiers et les pièces jointes ne peuvent pas être récupérés via Apex Archive.

          Pour accéder aux fichiers archivés, utilisez le composant Archiver ou la Recherche d'archives.

          Remarque
          Remarque

          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 ArchiverAccessor sont 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
            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 Name ou CreatedDate
            • 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 multiples
              SF_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 :

              List<SearchFilter> filters = new List<SearchFilter>();
              filters.add(new SearchFilter('Subject', '')); 
              Cette requête renvoie les enregistrements Requête dans lesquels le champ Objet est vide ou nul.

              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 de OR n'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.

          • Filtres de date : pour rechercher par date, utilisez le paramètre DateRange et les filtres obligatoires. DateRange filtre les enregistrements par des champs tels que ArchiveDate, CreatedDate ou ModifiedDate.

            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.

          • 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 Name et CreatedDate de 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.

            Remarque
            Remarque Le dépassement de 1000 enregistrements dans votre requête déclenche une erreur à l'exécution.
            Ce paramètre est facultatif.
          • 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.

          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.

          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
            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).

           
          Chargement
          Salesforce Help | Article