Loading
Uw Salesforce-organisatie instellen en onderhouden
Inhoudsopgave
Filters selecteren

          Geen resultaten
          Geen resultaten
          Hier zijn enkele zoektips

          Controleer de spelling van uw trefwoorden.
          Gebruik meer algemene zoektermen.
          Verwijder filters om uw zoekopdracht uit te breiden.

          De Help van Salesforce volledig doorzoeken
          Apex gegevensquery's archiveren

          Apex gegevensquery's archiveren

          Apex gegevensquery's archiveren schakelt programmatische toegang tot gearchiveerde gegevens in de app Archiveren in. Deze gegevensquery's automatiseren bedrijfsprocessen, ondersteunen externe systeemintegraties, maken aangepaste weergaven en rapporten, en maken kruisverwijzingen naar gearchiveerde gegevens met actieve records.

          De component Archiveren en Zoeken in archiveren bieden opties voor het handmatig ophalen van gegevens. Apex biedt geavanceerde mogelijkheden, zoals queryparameters, filters en paginering, voor directe toegang tot gegevens via code.

          Apex gegevensquery's omvatten:

          • Zoek in gearchiveerde records met behulp van opgegeven criteria.
          • Gebruik gedeeltelijke overeenkomsten met een asterisk (*).
          • Retourneer grote gegevenssets in batches van maximaal 1000 records per pagina.
          • Pas maximaal zes filters toe om uw resultaten te verfijnen.
          • Voer een query uit op gearchiveerde records, zelfs als het object is verwijderd uit uw productieorganisatie.

          Deze aan het systeem gerelateerde Salesforce-objecten worden uitgefilterd en zijn niet doorzoekbaar via Apex.

          • Feed
          • History
          • Relation
          • Share

          Om optimale prestaties te behouden en ervoor te zorgen dat alleen relevante gearchiveerde gegevens worden geretourneerd, sluit Archiveren deze objecten uit van zoekopdrachten.

          Opmerking
          Opmerking Bestanden en bijlagen kunnen niet worden opgehaald via Apex archiveren.

          Gebruik voor toegang tot gearchiveerde bestanden de component Archiveren of Zoeken in archief.

          Opmerking
          Opmerking

          Apex archiveren dwingt deze verzoeklimieten af.

          Interval Verzoeklimiet
          Per minuut 1000
          Per uur 30.000
          Per dag 100.000

          Als u deze limiet overschrijdt, ontvangt u HTTP-statuscode 429.

          Apex gegevensquerymethoden archiveren

          Stel voor het definiëren van de manier waarop u een query uitvoert op gearchiveerde gegevens, de methode in die wordt geboden door Apex archiveren.

          • Toegang tot archiefgegevens—De methoden binnen ArchiverAccessor zijn ontworpen voor interactie met gearchiveerde records. Vervolgens kunt u query's samenstellen en gegevens ophalen die zijn opgeslagen in het product Archiveren.
          • Querybewerkingen definiëren—Deze handtekeningen vertellen u welke soorten query's u kunt uitvoeren met behulp van Apex, zoals globale zoekopdrachten en gefilterde query's.
          • Gebruik begeleiden—Door methodehandtekeningen te onderzoeken kunnen ontwikkelaars inzicht krijgen in de invoer en uitvoer die vereist zijn voor hun implementaties.

          performArchiverGlobalSearch Methode

          Deze methode geeft de functionaliteit aan voor het uitvoeren van een globale zoekopdracht op gearchiveerde gegevens.

          Query Parameters

          Apex gegevensquery's gebruiken verschillende parameters om uw zoekopdracht te verfijnen. Sommige parameters zijn verplicht, terwijl andere optioneel zijn. Inzicht in de manier waarop u elke parameter configureert, helpt u de meest nauwkeurige en relevante resultaten te verkrijgen.

          • Objectnaam—Geeft het type Salesforce-object aan waarop een query moet worden uitgevoerd.

            string sObjectName = 'Account' geeft bijvoorbeeld aan dat de query is gericht op Accountrecords.

            Deze parameter is verplicht.

            Opmerking
            Opmerking Elke query is gericht op één object. Gebruik afzonderlijke query's om gegevens op te halen uit meerdere objecten.
          • Zoekfilters: filters die zoekresultaten verfijnen op basis van veldvoorwaarden.
            • Veldnaam: het veld waarop u wilt filteren, zoals Name of CreatedDate
            • Waarde of Lijst van waarden—De specifieke waarde of waarden die u wilt vergelijken

              Voorbeeld: Filter met enkelvoudige waarde

              SF_Archive.SearchFilter filter = new
              SF_Archive.SearchFilter('Name', 'test'); 

              Deze query retourneert records waarbij het veld Naam overeenkomt met de tekenreeks "test".

              Voorbeeld: Filter met meerdere waarden
              SF_Archive.SearchFilter filter = new
              SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'}); 

              Deze query retourneert records waarbij het veld Status overeenkomt met de tekenreeksen "Open" of "Gesloten".

              Omgaan met lege of null-waarden—Als u wilt zoeken naar records waarin een veld leeg of null is, voegt u een lege tekenreeks ("") toe aan de Lijst van waarden.

              Voorbeeld:

              List<SearchFilter> filters = new List<SearchFilter>();
              filters.add(new SearchFilter('Subject', '')); 
              Deze query retourneert caserecords waarbij het veld Onderwerp leeg of null is.

              Zoekfilterlimieten:

              • Query's vereisen minstens 1 filter per query.
              • Query's kunnen maximaal 6 filters hebben, gecombineerd met AND, per query.
              • Filters worden standaard gecombineerd met behulp van AND. OR wordt momenteel niet ondersteund.
              • De waardenlijst van een filter mag niet meer dan 1000 items bevatten.

            Deze parameter is verplicht.

          • Datumfilters—Gebruik voor zoeken op basis van datums de parameter DateRange en de verplichte filters. DateRange filtert records op velden zoals ArchiveDate, CreatedDate of ModifiedDate.

            Voorbeeld: Datumfilter voor specifieke datumquery

            Date todayDate = Date.today();
            Date jan1st2024 = Date.newInstance(2024, 1, 1);
            DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);

            Deze query retourneert records die zijn gearchiveerd tussen 1 januari 2024 en vandaag.

            Voorbeeld: Datumfilter voor meerdere datumbereiken

            List<SF_Archive.SearchFilter> filters = new List<SF_Archive.SearchFilter>();
            SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');
            filters.add(filter);
            string sObjectName = 'Account';
            
            Date myDate = Date.newInstance(2024, 1, 11); // January 11, 2024
            Date myDate2 = Date.newInstance(2023, 12, 25); // December 12, 2023
            SF_Archive.dateRange range = new SF_Archive.dateRange('CreatedDate', myDate, myDate);
            SF_Archive.dateRange range2 = new SF_Archive.dateRange('CreatedDate', myDate2, myDate2);
            list<SF_Archive.dateRange> ranges = new list<SF_Archive.dateRange> {range, range2};
            SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, filters, ranges);

            Deze query retourneert records die zijn gearchiveerd tussen 12 december 2023 en 11 januari 2024.

            Aanbevelingen voor datumfilters:

            • Voeg voor zoeken op basis van Archiveringsdatum het veld archive_date toe.
            • Gebruik de Apex datumnotatie: MM/DD/JJJJ.

            Deze parameter is optioneel.

          • Geretourneerde velden—Geef velden op die in de resultaten moeten worden opgenomen. Indien niet opgegeven, worden alle velden geretourneerd.

            Voorbeeld: Specifieke velden retourneren

            List<string> fields = new List<string>{'Name', 'CreatedDate'};

            Deze query retourneert alleen de Name en CreatedDate voor elke record.

            Deze parameter is optioneel.

          • Paginagrootte: stelt het aantal records per query in. Het standaardaantal records per query is 25 en het maximum is 1000.

            Voorbeeld: Aangepaste paginagrootte

            SF_Archive.ArchiverAccessorResponse res = 
            SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', 
            filters, 100, fields);

            Deze query retourneert 100 records per pagina.

            Opmerking
            Opmerking Overschrijding van 1000 records in uw query activeert een run-time fout.
            Deze parameter is optioneel.
          • Sorteerrichting: sorteert resultaten op een veld, zoals CreatedDate.
            • Oplopend (asc): Oudste naar nieuwste.
            • Aflopend (desc): Nieuwste naar oudste.

              Voorbeeld: Sorteerquery

              SortingDirection sortingDirection = new SortingDirection('desc');

              Deze query retourneert records gesorteerd in aflopende volgorde op basis van hun CreatedDate.

              Deze parameter is optioneel.

          getNextPage Methode

          Als de resultaten niet allemaal op dezelfde pagina passen, roept deze methode de volgende pagina aan.

          ScrollId Parameter

          Gebruik paginering om grote gegevenssets te retourneren door resultaten op te halen op pagina's van maximaal 1000 records.

          Voer voor het instellen van de pagineringswerkstroom de initiële query uit, gebruik de scrollId uit de respons om volgende pagina's op te halen en ga door tot aan de scrollId = '-1'..

          Voorbeeld: Resultaten ophalen met paginering

          // Perform initial search query
          SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', 
          filters, 100, fields);
                              
          // Get the search response
          SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
                              
          // Process first page of results
          system.debug('Total result count: ' + searchResponse.totalResultCount);
          system.debug('Records: ' + searchResponse.records);
                              
          // Fetch next page using the scrollId
          if (searchResponse.scrollId != '-1') {
          SF_Archive.ArchiverAccessorResponse nextPageRes = SF_Archive.ArchiverAccessor.getNextPage(searchResponse.scrollId);
          SF_Archive.ArchiverAccessorSearchResponse nextPageResponse = nextPageRes.getSearchResponseMap();
          system.debug('Next Page Records: ' + nextPageResponse.records);
          }

          Toegang tot de methoden

          Geef voor het zoeken van de methodehandtekeningen vanuit Set-up Apex klassen op in het vak Snel zoeken en selecteer vervolgens Apex klassen. Open de ArchiverAccessor. Zoek alle methoden die worden vermeld onder de naamruimte performArchiverGlobalSearch.

          Voorbeeld van gegevensquery

          In dit voorbeeld worden Account opgehaald met behulp van deze voorwaarden.

          • Velden: Name, CreatedDate
          • Limiet: 100 records per pagina
          • Naam: Bevat de tekenreeks "test"
          • Sorteren: Aflopend op CreatedDate
          List<SF_Archive.SearchFilter> filters = new List<SF_Archive.SearchFilter>();
          SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');
          filters.add(filter);
                          
          List<string> fields = new List<string>{'Name', 'CreatedDate'};
                          
          SortingDirection sortingDirection = new SortingDirection('desc');
                          
          SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', 
          filters, 100, fields, sortingDirection);
                      

          Veel voorkomende fouten oplossen

          Foutcode Beschrijving Oplossing
          INTERNAL_ERROR Er heeft zich een onverwachte fout voorgedaan. Neem contact op met de ondersteuning met foutdetails.
          RESOURCE_LIMIT_ERROR Limieten voor paginering of querygrootte overschreden. Verklein de paginagrootte of verfijn zoekfilters.
          VALIDATION_ERROR Ontbrekende of ongeldige zoekcriteria. Zorg ervoor dat alle velden en filters geldig zijn.

          Aanvullende aanbevelingen

          • Bewaak uw API-gebruik om te voorkomen dat u limieten bereikt.
          • Als u de respons op een object wilt casten, serialiseert u het in JSON en deserialiseert u het vervolgens weer in een object.
          • Controleer of velden zijn ingeschakeld en toegankelijk zijn.
          • Controleer alle queryparameters.
          • Voor onopgeloste problemen neemt u contact op met de ondersteuning van Salesforce met gedetailleerde logboeken.

          Zie Apex testen archiveren voor stapsgewijze testprocedures.

          Apex gegevensquery's archiveren—Codevoorbeeld

          In dit codevoorbeeld worden een filter, een datumbereik en een zoekopdracht in een archief gevalideerd via de statuscode in de app Archiveren.

          Een getNextPage na (scrollId != -1) is inbegrepen, omdat de grootte van de resultaten beperkt is in het performArchiverGlobalSearch.

          string sObjectName = 'Account';
          list<SF_Archive.SearchFilter>request = new list<SF_Archive.SearchFilter>();
          SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('Name', 'test');
          request.add(filter1);
          SF_Archive.dateRange range = new SF_Archive.dateRange('CreatedDate', system.today()-150, system.today());
          SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, range);
          
          if(res.getStatusCode() == 200){
              system.debug('code: ' + res.getStatuscode());
              SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
              system.debug('count: '+ searchResponse.totalResultCount);
              system.debug('scrollid: '+ searchResponse.scrollId);
              system.debug('list size: '+ searchResponse.records.size());
              string scrollId = searchResponse.scrollId;
              integer page = 1;
          
              while(scrollId != '-1'){
                  page++;
                  SF_Archive.ArchiverAccessorResponse secondPage =
                  SF_Archive.ArchiverAccessor.getNextPage(searchResponse.scrollId);
                  if(secondPage.getStatusCode() == 200){
                      SF_Archive.ArchiverAccessorSearchResponse searchResponse2 = secondPage.getSearchResponseMap();
                      scrollId = searchResponse2.scrollId;
                      system.debug('count: '+ searchResponse2.totalResultCount);
                      system.debug('scrollid: '+ searchResponse2.scrollId);
                      system.debug('list size: '+ searchResponse2.records.size());
                      system.debug('page number: '+ page);
                  } else{
                      system.debug('response is != 200: '+ secondPage.getStatusCode());
                      system.debug('body: '+ secondPage.getBody());
                      break;
                      } 
                  }
              } else {
                  system.debug('status code erorr|: '+ res.getStatusCode());
                  system.debug('status code message|: '+ res.getErrorMessage()); 
              }

          Apex gegevensquery's archiveren—Voorbeeld van gebruikscase 1

          Dit voorbeeld van een gebruikscase toont hoe u een component samenstelt en aanpast die accounts met hoge prioriteit weergeeft in de app Archiveren.

          Gebruikscase

          Uw bedrijf vereist dat het ondersteuningsteam van Laag 3 toegang heeft om gearchiveerde cases met een status met hoge prioriteit weer te geven.

          In dit voorbeeld ziet u hoe u:

          • Maak een aangepaste Lightning Web Component (LWC).
          • Haal gearchiveerde gegevens op met behulp van Apex gegevensquery's.
          • Pas het filter toe (Hoge prioriteit).
            Opmerking
            Opmerking Andere filters kunnen worden aangepast door te verwijzen naar de code in Apex gegevensquery's archiveren — Codevoorbeeld.

            Dit voorbeeld is beperkt tot 25 records. Met Apex kunt u de resultaten instellen op 1000 per pagina. De standaardinstelling is 25, met de optie van paginering door de resultaten.

          Component Cases met hoge prioriteit weergeven

          Voorbeeld van SdkUseCaseWidget.js

          In dit codevoorbeeld is de parameter AccountRecordId.

          import { LightningElement, api, track } from 'lwc';
              import getCases from '@salesforce/apex/ArchiveSdk.getCases';
              export default class SampleSdkUseCaseWidget extends LightningElement {
              @api recordId;
              
              columns = [
              { label: 'Case Number', fieldName: 'caseNumber', type: 'text', cellAttributes: {alignment: 'center'}},
              { label: 'Subject', fieldName: 'subject', type: 'text' , cellAttributes: {alignment: 'center'}, },
              { label: 'Priority', fieldName: 'priority', type: 'text', cellAttributes: {alignment: 'center'}, },
              { label: 'Status', fieldName: 'status', type: 'text', cellAttributes: {alignment: 'center'}, }
              ];
              @track records;
              @track data
              @track _loading;
              
              async connectedCallback() {
              this._loading = true;
              try {
              const result = await getCases({parentId: this.recordId})
              this.records = result;
              this._loading = false;
              } catch (error) {
              this._loading = false;
              }}
          }            

          Voorbeeld van SdkUseCaseWidget.html

          De Apex controller die de LWC gebruikt roept Apex Data Queries aan.

          SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);

          Dit is de oproep voor Apex archiveren. Het omvat deze parameters.

          • sObjectName—Geeft de zoekopdracht weer
          • Filters: gebruikt om de gegevens op te halen
          • Velden: de geprojecteerde velden die moeten worden geretourneerd vanuit gegevens.
          • Bereik: het datumbereik dat wordt gebruikt voor het uitvoeren van een query op de gegevens.
          <template>
              <template if:true={_loading}>
                  <lightning-spinner></lightning-spinner>
              </template>
              <lightning-datatable
                  key-field="caseNumber"
                  data={records}
                  columns={columns}
                  hide-checkbox-column>
              </lightning-datatable>
          </template>

          ArchiveSdk.cls

          Dit codeblok is de Apex controller.

          public with sharing class ArchiveSDK {
                          
              @AuraEnabled
              public static List<CaseTableWrapperExample.CaseRecord> getCases(String parentId) {
              // Create an empty list to hold maps with String keys and Object values
              List<Map<String, Object>> totalRecords = new List<Map<String, Object>>();
              
              // Create a list to store search filter objects
              List<SF_Archive.SearchFilter> request = new List<SF_Archive.SearchFilter>();
              
              // Create a search filter for the 'AccountId' field with a given 'parentId' value
              SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('AccountId', parentId);
              
              // Create a search filter for the 'Priority' field with a given 'High' value
              SF_Archive.SearchFilter filter2 = new SF_Archive.SearchFilter('Priority', 'High');
              
              // Add the filters to the request list
              request.add(filter1);
              request.add(filter2);
              
              // Define the object name as 'Case'
              String sObjectName = 'Case';
              
              // Create a list of Strings representing field names to be retrieved from Archive DB
              List<String> fields = new List<String>{'CaseNumber', 'Subject', 'Priority', 'Status'};
              
              // Create the DateRange based on the created date
              SF_Archive.DateRange range = new SF_Archive.DateRange('CreatedDate', system.today() - 150, system.today());
              
              // Perform an initial global search and store the response
              SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, range);
              
              // Check if the HTTP response status code is 200 (success)
              if (res.getStatusCode() == 200) {
                  system.debug('code: ' + res.getStatuscode());
                  
                  // Retrieve the initial search response map
                  SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
                  
                  system.debug('count: ' + searchResponse.totalResultCount);
                  system.debug('scrollid: ' + searchResponse.scrollId);
                  system.debug('list size: ' + searchResponse.records.size());
                  
                  // Store the scroll ID for pagination
                  String scrollId = searchResponse.scrollId;
                  
                  // Initialize the page number
                  Integer page = 1;
                  
                  // Add the records from the initial search to the totalRecords list
                  totalRecords.addAll(searchResponse.records);
                  
                  // Continue to fetch additional pages while the scroll ID is not '-1'
                  while (scrollId != '-1') {
                      page++;
                      
                      // Get the next page of search results using the UPDATED scrollId 
                      SF_Archive.ArchiverAccessorResponse nextPageResponse = SF_Archive.ArchiverAccessor.getNextPage(scrollId);
                      
                      // Check if the HTTP response status code is 200 (success)
                      if (nextPageResponse.getStatusCode() == 200) {
                      
                          // Retrieve the search response for the current page
                          SF_Archive.ArchiverAccessorSearchResponse searchResponse2 = nextPageResponse.getSearchResponseMap();
                          
                          // CRITICAL FIX: Update the scrollId with the value from the new response 
                          scrollId = searchResponse2.scrollId;
                          
                          system.debug('count: ' + searchResponse2.totalResultCount);
                          system.debug('scrollid: ' + searchResponse2.scrollId);
                          system.debug('list size: ' + searchResponse2.records.size());
                          system.debug('page number: ' + page); 
                          
                          // Add the records from the current page to the totalRecords list
                          totalRecords.addAll(searchResponse2.records);
                      } else {
                          // Output an error message if the HTTP response status code is not 200
                          system.debug('response is != 200: ' + nextPageResponse.getStatusCode());
                          system.debug('body: ' + nextPageResponse.getBody());
                          
                          // Break out of the loop if there is an error
                          break;
                      }
                  } // End of while loop
              } else {
                  // Handle error from initial search
                  system.debug('status code error: ' + res.getStatusCode());
                  system.debug('status code message: ' + res.getErrorMessage());
              }
              
              // Return the list of total records
              List<CaseTableWrapperExample.CaseRecord> result = new List<CaseTableWrapperExample.CaseRecord>();
              return CaseTableWrapperExample.getCasesTable(totalRecords);
              }
          }

          CaseTableWrapperExample.cls

          Helperklasse voor het formuleren van klasse van Apex naar LWC

          public class CaseTableWrapperExample{
              public static List<caseRecord> getCasesTable(list<map<string,object>> cases){
              List<caseRecord> caseReturnList = new List<caseRecord>();
              for(Map<string,object> caseRecord: cases){
              caseRecord tempCase = new caseRecord();
              tempCase.caseNumber = String.valueOf(caseRecord.get('CaseNumber'));
              tempCase.id = String.valueOf(caseRecord.get('Id'));
              tempCase.origin = String.valueOf(caseRecord.get('Origin'));
              tempCase.status = String.valueOf(caseRecord.get('Status'));
              tempCase.subject = String.valueOf(caseRecord.get('Subject'));
              tempCase.priority = String.valueOf(caseRecord.get('Priority'));
                  
              caseReturnList.add(tempCase);
              }
              return caseReturnList;
              }
              
              public class caseRecord {
              @AuraEnabled public string caseNumber;
              @AuraEnabled public string id;
              @AuraEnabled public string origin;
              @AuraEnabled public string status;
              @AuraEnabled public string priority;
              @AuraEnabled public string subject;
          }}

          De bovenstaande code beschrijft een voorbeeldscenario waarbij u LWC als component kunt toevoegen aan de Lightning pagina.

          Voeg voor het weergeven van de feitelijke Lightning gegevenstabel deze code toe aan het sampleSdkUseCaseWidget.js-meta.xml. Voeg vervolgens de component Archiveren toe aan de Lightning pagina.

          <?xml version="1.0" encoding="UTF-8"?>
          <LightningComponentBundle xmlns="<a href='http://soap.sforce.com/2006/04/metadata">;
              <apiVersion>55.0</apiVersion>
              <isExposed>true</isExposed>
              <targets>
              <target>lightning__RecordPage</target>
              <target>lightning__AppPage</target>
              </targets>
              <targetConfigs>
              <targetConfig targets="lightning__RecordPage">
              <supportedFormFactors>
              <supportedFormFactor type="Small" />
              <supportedFormFactor type="Large" />
              </supportedFormFactors>
              </targetConfig>
              <targetConfig targets="lightning__AppPage">
              <supportedFormFactors>
              <supportedFormFactor type="Small" />
              <supportedFormFactor type="Large" />
              </supportedFormFactors>
              </targetConfig>
              </targetConfigs>
          </LightningComponentBundle>

          Apex gegevensquery's archiveren—Voorbeeld van gebruikscase 2

          Dit voorbeeld van een gebruikscase toont hoe Apex taken archiveert zonder beheerlimieten te overschrijden, zoals CPU-limieten of Time-out-aanroepen, in de app Archiveren.

          Zie Apex Governor Limits voor meer informatie.

          Gebruikscase

          Uw bedrijf vereist dat het ondersteuningsteam van Laag 3 toegang heeft om gearchiveerde cases met een status met hoge prioriteit weer te geven.

          Dit voorbeeld toont hoe u een fout kunt omzeilen wanneer het aantal gearchiveerde records dat via Apex wordt opgehaald, te groot is. De fout luidt: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time allotted for callout, please contact support.

          Code uit deze Apex klassen maakt deze gebruikscase.

          De ArchiveSecondPageJob verwerkt gepagineerde gegevens uit Archiveren met behulp van een scrol-ID, waarbij indien nodig aanroepen worden gedaan. Deze wordt asynchroon uitgevoerd via de interface Wachtrijbaar, waarbij de totale uitvoeringstijd wordt bijgehouden om overschrijding van limieten te voorkomen en zichzelf indien nodig in een wachtrij wordt geplaatst voor verdere verwerking. De klasse verwerkt responsen, werkt de scroll-ID bij en legt details vast over elke opgehaalde gegevenspagina.

          public class ArchiveSecondPageJob implements Queueable,Database.AllowsCallouts {
                                    
                 private String scrollId;
                 private long totalTime;
                 private integer pageNumber;
          
                 public archiveSecondPageJob(String prevScrollId, integer pageNumber) {
                     scrollId = prevScrollId;
                     this.pageNumber = pageNumber;
                 }
          
                 public void execute(QueueableContext context) {
                     system.debug('executing');
                     doExecute();
                 }
                 private void doExecute() {
                         SF_Archive.ArchiverAccessorSearchResponse searchResponse = null;
                         integer page = 1;
                         long totalTime = 0;
            
                                 while(scrollId != '-1')
                                 {       
                                     //avoid 12000 ms limit
                                     if(totalTime > 90000){
                                         system.debug('Creating new task');
                archiveSecondPageJob q = new archiveSecondPageJob(scrollId,this.pageNumber);
                                         System.enqueueJob(q);
                                         return;
                                     }
                                     //Get the next page using the scrollId     
                                     Long startTime = DateTime.now().getTime(); 
                                     SF_Archive.ArchiverAccessorResponse nextPage = SF_Archive.ArchiverAccessor.getNextPage(scrollId); 
                                     Long stopTime = DateTime.now().getTime();
                                     totalTime += stopTime - startTime;
                                     if(nextPage.getStatusCode() == 200){     
                                         this.pageNumber++;
                                         SF_Archive.ArchiverAccessorSearchResponse searchResponse2 =nextPage.getSearchResponseMap();      
                                         scrollId = searchResponse2.scrollId;
                                         system.debug('count: '+ searchResponse2.totalResultCount);    
                                         system.debug('scrollid: '+ searchResponse2.scrollId); 
                                         system.debug('list size: '+ searchResponse2.records.size());  
                                         system.debug('body: '+ searchResponse2.records);  
                                         system.debug('page: '+ pageNumber);  
                                         system.debug('time: '+ totalTime); 
                                     }       
                                     else{           
                                         system.debug('response is != 200: '+ nextPage.getStatusCode());           
                                         system.debug('body: '+ nextPage.getBody());
                                         return;
                                     }           
                                 }
                 }
          }
                      

          De klasse ArchiveSearch voert een zoekopdracht uit op het object Case met behulp van specifieke filters, haalt de resultaten op en registreert details zoals de totale telling en de scroll-ID. Als de zoekopdracht een geldige scrol-ID retourneert, hetgeen meer pagina's met resultaten aangeeft, plaatst deze de archiveSecondPageJob in de wachtrij om de volgende pagina asynchroon te verwerken. Deze klasse initieert in wezen de zoekopdracht en geeft verdere verwerking door aan de eerder gedefinieerde archiveSecondPageJob.

          Hier is de indeling voor het initiële zoekgesprek.

          public class ArchiveSearch {
                              
              public void doSearch(){
                  
                  string sObjectName = 'Case';
                  list<SF_Archive.SearchFilter> request = new list<SF_Archive.SearchFilter>();
              
                  SF_Archive.SearchFilter filter1 = new SF_Archive.SearchFilter('Priority', 'High');
                  request.add(filter1);
                  
             
                  list<string> fields = new list<string>{'CaseNumber', 'Id'};
                  
                  SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields);   
                  if(res.getStatusCode() == 200){
                     system.debug('code: ' + res.getStatuscode());
                     SF_Archive.ArchiverAccessorSearchResponse searchResponse = res.getSearchResponseMap();
                     system.debug('count: '+ searchResponse.totalResultCount);
                     system.debug('scrollid: '+ searchResponse.scrollId);
                     system.debug('list size: '+ searchResponse.records.size());
                     string scrollId = searchResponse.scrollId;
                     integer page = 1;   
                     if(scrollId != '-1'){
                         system.debug('calling next page');
                         integer pageNumber = 2;
                         archiveSecondPageJob q = new archiveSecondPageJob(scrollId, pageNumber);
                         System.enqueueJob(q);
             }}}}

          Zie Salesforce Apex Developer Guide voor meer informatie.

           
          Wordt geladen
          Salesforce Help | Article