Loading
Impostazione e gestione dell'organizzazione Salesforce
Sommario
Seleziona filtri

          Nessun risultato
          Nessun risultato
          Ecco alcuni suggerimenti per la ricerca

          Controlla l'ortografia delle parole chiave.
          Usa termini di ricerca più generici.
          Seleziona meno filtri per ampliare la tua ricerca.

          Cerca in tutta la Guida di Salesforce
          Archiviazione di query sui dati Apex

          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.

          • Feed
          • History
          • Relation
          • Share

          Per mantenere prestazioni ottimali e assicurarsi che vengano restituiti solo i dati archiviati pertinenti, Archivia esclude questi oggetti dalle ricerche.

          Nota
          Nota File e allegati non possono essere recuperati tramite Apex Archiviazione.

          Per accedere ai file archiviati, utilizzare il componente Archivia o la ricerca Archivia.

          Nota
          Nota

          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 ArchiverAccessor sono 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
            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 Name o CreatedDate
            • 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 multipli
              SF_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:

              List<SearchFilter> filters = new List<SearchFilter>();
              filters.add(new SearchFilter('Subject', '')); 
              Questa query restituisce i record Caso in cui il campo Oggetto è vuoto o nullo.

              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 AND per impostazione predefinita. La logica di OR non è attualmente supportata.
              • L'elenco dei valori di un filtro non può superare 1.000 elementi.

            Questo parametro è obbligatorio.

          • Filtri data: per eseguire la ricerca in base alle date, utilizzare il parametro DateRange e i filtri obbligatori. DateRange filtra i record in base a campi come ArchiveDate, CreatedDate o ModifiedDate.

            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.

          • 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 Name e CreatedDate per 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.

            Nota
            Nota Il superamento di 1.000 record nella query attiva un errore in fase di esecuzione.
            Questo parametro è facoltativo.
          • 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.

          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.

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

           
          Caricamento
          Salesforce Help | Article