Loading
Opsæt og vedligehold din Salesforce-organisation
Indhold
Vælg filtre

          Ingen resultater
          Ingen resultater
          Her er nogle søgetips

          Kontroller stavemåden for dine søgeord.
          Brug mere generelle søgeudtryk.
          Vælg færre filtre for at gøre søgningen bredere.

          Søg efter alle i Hjælp til Salesforce
          Arkiver Apex

          Arkiver Apex

          Arkiver Apex aktiverer programmeringsmæssig adgang til arkiverede data i appen Arkiver. Disse dataforespørgsler automatiserer forretningsprocesser, understøtter tredjepartssystemintegrationer, opretter tilpassede visninger og rapporter og krydsrefererer til arkiverede data med aktive registreringer.

          Komponenten Arkiver og Arkiver søgning giver mulighed for manuel hentning af data. Apex tilbyder avancerede funktioner, f.eks. forespørgselsparametre, filtre og sideinddeling, til direkte dataadgang via kode.

          Funktioner for Apex inkluderer:

          • Søg i arkiverede registreringer ved brug af angivne kriterier.
          • Brug delvis matchning med en stjerne (*).
          • Returner store datasæt i batches på op til 1.000 registreringer pr. side.
          • Anvend op til seks filtre for at justere dine resultater.
          • Forespørg på arkiverede registreringer, selvom objektet er blevet slettet fra din produktionsorganisation.

          Disse systemrelaterede Salesforce-objekter filtreres ud og kan ikke søges via Apex.

          • Feed
          • History
          • Relation
          • Share

          Hvis du vil vedligeholde optimal ydeevne og sikre, at kun relevante arkiverede data returneres, ekskluderer Arkiver disse objekter fra søgninger.

          Bemærk
          Bemærk Filer og vedhæftede filer kan ikke hentes gennem Arkiver Apex.

          Hvis du ønsker adgang til arkiverede filer, skal du bruge komponenten Arkiver eller Arkivsøgning.

          Bemærk
          Bemærk

          Arkiver Apex håndhæver disse anmodningsgrænser.

          Interval Anmodningsgrænse
          Pr. minut 1.000
          Pr. time 30.000
          Pr. dag 100.000

          Hvis du overskrider denne grænse, modtager du HTTP-statuskode 429.

          Arkiver Apex

          Hvis du vil definere, hvordan du forespørger på arkiverede data, skal du angive den metode, der leveres af Arkiver Apex.

          • Adgang til arkiveringsdata – Metoderne i ArchiverAccessor er designet til at interagere med arkiverede registreringer. Derefter kan du opbygge forespørgsler og hente data, der er lagret i arkiveringsproduktet.
          • Definering af forespørgselshandlinger – Disse signaturer fortæller dig, hvilke typer forespørgsler du kan udføre ved brug af Apex, f.eks. globale søgninger og filtrerede forespørgsler.
          • Vejledning i anvendelse – Ved at undersøge metodesignaturer kan udviklere forstå de input og output, der er påkrævet for deres implementeringer.

          performArchiverGlobalSearch metode

          Denne metode angiver funktionaliteten til at udføre en global søgning på arkiverede data.

          Query parametre

          Apex bruger flere parametre til at justere din søgning. Nogle parametre er påkrævede, mens andre er valgfri. Forståelse af, hvordan du konfigurerer hver parameter, hjælper dig med at få de mest nøjagtige og relevante resultater.

          • Objektnavn – Angiver typen af Salesforce-objekt, der skal forespørges på.

            string sObjectName = 'Account' angiver f.eks., at forespørgslen målrettes mod kontoregistreringer.

            Denne parameter er obligatorisk.

            Bemærk
            Bemærk Hver forespørgsel målretter mod et enkelt objekt. Brug separate forespørgsler til at hente data fra flere objekter.
          • Søgefiltre – Filtre, der indsnævrer søgeresultater baseret på feltbetingelser.
            • Feltnavn – Det felt, du vil filtrere efter, f.eks. Name eller CreatedDate
            • Værdi eller Liste over værdier – Den specifikke værdi eller de værdier, du vil matche

              Eksempel: Enkelt værdi-filter

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

              Denne forespørgsel returnerer registreringer, hvor feltet Navn matcher strengen "test".

              Eksempel: Flere værdifiltre
              SF_Archive.SearchFilter filter = new
              SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'}); 

              Denne forespørgsel returnerer registreringer, hvor feltet Status matcher strengen "Åben" eller "Lukket".

              Håndtering af tomme værdier eller nulværdier – Hvis du vil søge efter registreringer, hvor et felt er tomt eller nul, skal du føje en tom streng ("") til listen over værdier.

              Eksempel:

              List<SearchFilter> filters = new List<SearchFilter>();
              filters.add(new SearchFilter('Subject', '')); 
              Denne forespørgsel returnerer sagsregistreringer, hvor feltet Emne enten er tomt eller nul.

              Begrænsninger for søgefiltre:

              • Forespørgsler kræver mindst 1 filter pr. forespørgsel.
              • Forespørgsler kan have op til 6 filtre kombineret med AND logik pr. forespørgsel.
              • Filtre kombineres ved brug af AND-logik som standard. OR understøttes ikke i øjeblikket.
              • Et filters værdiliste må ikke overstige 1.000 elementer.

            Denne parameter er obligatorisk.

          • Datofiltre – Hvis du vil søge efter datoer, skal du bruge DateRange-parameteren og de obligatoriske filtre. DateRange filtrerer registreringer efter felter som f.eks. ArchiveDate, CreatedDate eller ModifiedDate.

            Eksempel: Datofilter for specifik datoforespørgsel

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

            Denne forespørgsel returnerer registreringer, der er arkiveret mellem den 1. januar 2024 og i dag.

            Eksempel: Datofilter for flere datoområder

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

            Denne forespørgsel returnerer registreringer, der er arkiveret mellem den 12. december 2023 og den 11. januar 2024.

            Anbefalinger for datofiltre:

            • Hvis du vil søge på baggrund af Arkiveringsdatoen, skal du tilføje feltet archive_date.
            • Brug Apex: MM/DD/ÅÅÅÅ.

            Denne parameter er valgfri.

          • Returnerede felter – Angiv felter, der skal inkluderes i resultaterne. Hvis det ikke er angivet, returneres alle felter.

            Eksempel: Returspecifikke felter

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

            Denne forespørgsel returnerer kun felterne Name og CreatedDate for hver registrering.

            Denne parameter er valgfri.

          • Sidestørrelse – Angiver antallet af registreringer pr. forespørgsel. Standardantallet af registreringer pr. forespørgsel er 25, og maksimum er 1.000.

            Eksempel: Tilpasset sidestørrelse

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

            Denne forespørgsel returnerer 100 registreringer pr. side.

            Bemærk
            Bemærk Over 1.000 registreringer i din forespørgsel udløser en kørselsfejl.
            Denne parameter er valgfri.
          • Sorteringsretning – Sorterer resultater efter et felt, f.eks. CreatedDate.
            • Stigende (asc): Gammeleste til nyeste.
            • Faldende (desc): Nyeste til ældste.

              Eksempel: Sorteringsforespørgsel

              SortingDirection sortingDirection = new SortingDirection('desc');

              Denne forespørgsel returnerer registreringer sorteret i faldende rækkefølge baseret på deres CreatedDate.

              Denne parameter er valgfri.

          getNextPage metode

          Hvis resultaterne ikke alle passer på den samme side, kalder denne metode den næste side.

          ScrollId-parameter

          Brug sideinddeling til at returnere store datasæt ved at hente resultater på sider på op til 1.000 registreringer.

          Hvis du vil opsætte sideinddelingsarbejdsflowet, skal du udføre den indledende forespørgsel, bruge scrollId fra svaret til at hente efterfølgende sider og fortsætte til scrollId = '-1'..

          Eksempel: Hent resultater med sideinddeling

          // 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);
          }

          Få adgang til metoderne

          Hvis du vil finde metodesignaturerne, skal du skrive Apex i feltet Find hurtigt i Opsætning og derefter vælge Apex. Åbn ArchiverAccessor. Find alle metoder, der er angivet under performArchiverGlobalSearch-navneområdet.

          Eksempel på dataforespørgsel

          Dette eksempel henter Account ved brug af disse betingelser.

          • Felter: Name, CreatedDate
          • Grænse: 100 registreringer pr. side
          • Navn: Indeholder streng "test"
          • Sortering: Faldende efter 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);
                      

          Fejlfind almindelige fejl

          Fejlkode Beskrivelse Løsning
          INTERNAL_ERROR Der opstod en uventet fejl. Kontakt Support med fejldetaljer.
          RESOURCE_LIMIT_ERROR Overskridt grænser for sideinddeling eller forespørgselsstørrelse. Reducer sidestørrelse, eller juster søgefiltre.
          VALIDATION_ERROR Manglende eller ugyldige søgekriterier. Sørg for, at alle felter og filtre er gyldige.

          Yderligere anbefalinger

          • Overvåg din API-anvendelse for at undgå at nå grænserne.
          • Hvis du vil videresende svaret til et objekt, skal du serialisere det til JSON og derefter deserialisere det tilbage til et objekt.
          • Bekræft, at felter er aktiveret og tilgængelige.
          • Dobbeltkontroller alle forespørgselsparametre.
          • For uløste problemer skal du kontakte Salesforce Support med detaljerede logfiler.

          For trinvise testprocedurer kan du se Arkiver Apex-test.

          Arkiver Apex – kodeeksempel

          I dette kodeeksempel valideres et filter, et datointerval og en arkivsøgesanmodning gennem statuskoden i appen Arkiver.

          Et getNextPage efter (scrollId != -1) inkluderes, da størrelsen på resultaterne er begrænset i 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()); 
              }

          Arkiver Apex – Eksempelanvendelsessituation 1

          Dette eksempel på anvendelse viser, hvordan du opbygger og tilpasser en komponent, der viser konti med høj prioritet i appen Arkiver.

          Anvendelsessituation

          Din forretning kræver, at Niveau 3-supportteamet har adgang til at se arkiverede sager med statussen Høj prioritet.

          Dette eksempel viser, hvordan du:

          • Opret en tilpasset Lightning Web-komponent (LWC).
          • Hent arkiverede data ved brug af Apex.
          • Anvend filteret (Høj prioritet).
            Bemærk
            Bemærk Andre filtre kan tilpasses ved at referere til koden i Arkiver Apex – kodeeksempel.

            Dette eksempel er begrænset til 25 registreringer. Apex giver dig mulighed for at angive resultaterne til 1.000 pr. side. Standarden er 25 med mulighed for sideinddeling gennem resultaterne.

          Komponent, der viser sager med høj prioritet

          Eksempel på SdkUseCaseWidget.js

          I dette kodeeksempel er parameteren 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;
              }}
          }            

          Eksempel på SdkUseCaseWidget.html

          Den Apex, som LWC bruger, kalder Apex.

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

          Dette er opfordringen til Arkiver Apex. Den indeholder disse parametre.

          • sObjectName – viser søgningen
          • Filtre – Bruges til at hente data
          • Felter – De projicerede felter, der skal returneres fra data.
          • Område – Det datoområde, der bruges til at forespørge på dataene.
          <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

          Denne kodeblok er 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

          Hjælperklasse til at formulere klasse fra Apex til 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;
          }}

          Koden ovenfor beskriver et eksempelscenarie, hvor du kan føje LWC som en komponent til Lightning.

          Hvis du vil se den faktiske Lightning-datatabel, skal du føje denne kode til sampleSdkUseCaseWidget.js-meta.xml-filen. Føj derefter komponenten Arkiver til 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>

          Arkiver Apex – Eksempelanvendelsessituation 2

          Dette eksempel viser, hvordan Arkiver Apex håndterer opgaver uden at overskride styringsbegrænsninger, f.eks. CPU-grænser eller Timeout-udkald i appen Arkiver.

          Yderligere oplysninger findes i Apex-styringsbegrænsninger.

          Anvendelsessituation

          Din forretning kræver, at Niveau 3-supportteamet har adgang til at se arkiverede sager med statussen Høj prioritet.

          Dette eksempel viser, hvordan du undgår en fejl, når antallet af arkiverede registreringer, der hentes via Apex, er for stort. Fejlen lyder: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time allotted for callout, please contact support.

          Kode fra disse Apex opretter denne anvendelsessituation.

          ArchiveSecondPageJob behandler sideinddelte data fra Arkiver ved brug af et rulle-id og foretager udkald efter behov. Den kører asynkront via Køgrænsefladen og sporer den samlede kørselstid for at undgå at overskride grænserne og sætter sig selv i kø til fortsat behandling, hvis det er nødvendigt. Klassen håndterer svar, opdaterer rulle-id'et og logfører detaljer om hver hentet dataside.

          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;
                                     }           
                                 }
                 }
          }
                      

          ArchiveSearch-klassen udfører en søgning på objektet Sag ved brug af specifikke filtre, henter resultaterne og logfører detaljer som f.eks. det samlede antal og rulle-id'et. Hvis søgningen returnerer et gyldigt rulle-id, der angiver flere resultatsider, sætter den archiveSecondPageJob til at behandle den næste side asynkront. Denne klasse initierer i det væsentlige søgningen og overfører yderligere behandling til de tidligere definerede archiveSecondPageJob.

          Her er formatet på det indledende søgeopkald.

          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);
             }}}}

          Hvis du ønsker yderligere oplysninger, kan du se Salesforce Apex Developer Guide.

           
          Indlæser
          Salesforce Help | Article