Loading
Einrichtung und Pflege der Salesforce-Organisation
Inhalt
Filter auswählen

          Keine Ergebnisse
          Keine Ergebnisse
          Hier sind einige Suchtipps

          Überprüfen Sie die Schreibweise Ihrer Stichwörter.
          Verwenden Sie allgemeinere Suchbegriffe.
          Wählen Sie weniger Filter aus, um Ihre Suche auszuweiten.

          Gesamte Salesforce-Hilfe durchsuchen
          Archivieren von Apex-Datenabfragen

          Archivieren von Apex-Datenabfragen

          Archivieren Apex-Datenabfragen ermöglichen den programmgesteuerten Zugriff auf archivierte Daten in der Anwendung "Archivieren". Diese Datenabfragen automatisieren Geschäftsprozesse, unterstützen Drittanbieter-Systemintegrationen, erstellen benutzerdefinierte Ansichten und Berichte und verweisen auf archivierte Daten mit aktiven Datensätzen.

          Die Komponente "Archiv" und die Archivsuche bieten Optionen für den manuellen Datenabruf. Apex bietet erweiterte Funktionen wie Abfrageparameter, Filter und Paginierung für den direkten Datenzugriff über Code.

          Zu den Funktionen der Apex-Datenabfrage zählen:

          • Durchsuchen Sie archivierte Datensätze anhand der angegebenen Kriterien.
          • Verwenden Sie die teilweise Übereinstimmung mit einem Sternchen (*).
          • Geben Sie große Datensets in Batches mit bis zu 1.000 Datensätzen pro Seite zurück.
          • Wenden Sie bis zu sechs Filter an, um Ihre Ergebnisse einzugrenzen.

          Diese systembezogenen Salesforce-Objekte werden herausgefiltert und können nicht über Apex durchsucht werden.

          • Feed
          • History
          • Relation
          • Share

          Archivieren schließt diese Objekte von Suchvorgängen aus, um die optimale Leistung aufrechtzuerhalten und sicherzustellen, dass nur relevante archivierte Daten zurückgegeben werden.

          Hinweis
          Hinweis Dateien und Anhänge können nicht über Apex archivieren abgerufen werden.

          Verwenden Sie für den Zugriff auf archivierte Dateien die Komponente "Archivieren" oder die Archivsuche.

          Archivieren von Apex-Datenabfragemethoden

          Legen Sie die von Apex archivierte Methode fest, um zu definieren, wie Sie archivierte Daten abfragen.

          • Zugreifen auf Archivdaten: Die Methoden in ArchiverAccessor sind für die Interaktion mit archivierten Datensätzen konzipiert. Anschließend können Sie Abfragen erstellen und im Produkt "Archivieren" gespeicherte Daten abrufen.
          • Definieren von Abfragevorgängen: Anhand dieser Signaturen können Sie nachvollziehen, welche Arten von Abfragen Sie mithilfe von Apex ausführen können, beispielsweise globale Suchen und gefilterte Abfragen.
          • Leitende Verwendung: Durch die Untersuchung von Methodensignaturen können Entwickler die für ihre Implementierungen erforderlichen Ein- und Ausgaben nachvollziehen.

          performArchiverGlobalSearch Methode

          Diese Methode gibt die Funktion zum Ausführen einer globalen Suche nach archivierten Daten an.

          Query Parameter

          Apex-Datenabfragen verwenden verschiedene Parameter, um Ihre Suche einzugrenzen. Einige Parameter sind erforderlich, andere optional. Wenn Sie wissen, wie die einzelnen Parameter konfiguriert werden, erhalten Sie die genauesten und relevantesten Ergebnisse.

          • Objektname: Gibt den Typ des abzufragenden Salesforce-Objekts an.

            string sObjectName = 'Account' gibt beispielsweise an, dass die Abfrage auf Accountdatensätze abzielt.

            Dieser Parameter ist obligatorisch.

            Hinweis
            Hinweis Jede Abfrage zielt auf ein einzelnes Objekt ab. Verwenden Sie separate Abfragen, um Daten aus mehreren Objekten abzurufen.
          • Suchfilter: Filter, die Suchergebnisse anhand von Feldbedingungen eingrenzen.
            • Feldname: Das Feld, nach dem gefiltert werden soll, beispielsweise Name oder CreatedDate
            • Wert oder Liste der Werte: Der oder die spezifischen Werte, die abgeglichen werden sollen

              Beispiel: Einzelwertfilter

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

              Diese Abfrage gibt Datensätze zurück, bei denen das Feld Name mit der Zeichenfolge "test" übereinstimmt.

              Beispiel: Filter für mehrere Werte
              SF_Archive.SearchFilter filter = new
              SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'}); 

              Diese Abfrage gibt Datensätze zurück, bei denen das Statusfeld mit den Zeichenfolgen "Offen" oder "Geschlossen" übereinstimmt.

              Umgang mit leeren oder Nullwerten: Wenn Sie nach Datensätzen suchen möchten, bei denen ein Feld leer oder null ist, können Sie der Liste der Werte eine leere Zeichenfolge ("") hinzufügen.

              Beispiel:

              List<SearchFilter> filters = new List<SearchFilter>();
              filters.add(new SearchFilter('Subject', '')); 
              Diese Abfrage gibt Kundenvorgangsdatensätze zurück, bei denen das Feld "Betreff" leer oder null ist.

              Obergrenzen für Suchfilter:

              • Abfragen müssen über mindestens 1 Filter pro Abfrage verfügen.
              • Abfragen können bis zu 6 Filter in Kombination mit AND pro Abfrage aufweisen.
              • Filter werden standardmäßig mithilfe der AND kombiniert. Die OR wird derzeit nicht unterstützt.
              • Die Werteliste eines Filters darf 1.000 Elemente nicht überschreiten.

            Dieser Parameter ist obligatorisch.

          • Datumsfilter: Wenn Sie anhand von Datumswerten suchen möchten, verwenden Sie den Parameter DateRange und die obligatorischen Filter. DateRange filtert Datensätze nach Feldern wie ArchiveDate, CreatedDate oder ModifiedDate.

            Beispiel: Datumsfilter für eine bestimmte Datumsabfrage

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

            Diese Abfrage gibt Datensätze zurück, die zwischen dem 1. Januar 2024 und heute archiviert wurden.

            Beispiel: Datumsfilter für mehrere Datumsbereiche

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

            Diese Abfrage gibt Datensätze zurück, die zwischen dem 12. Dezember 2023 und dem 11. Januar 2024 archiviert wurden.

            Datumsfilterempfehlungen:

            • Fügen Sie das Feld "archive_date" hinzu, um anhand des Archivdatums zu suchen.
            • Verwenden Sie das Apex-Datumsformat: MM/TT/JJJJ.

            Dieser Parameter ist optional.

          • Zurückgegebene Felder: Geben Sie Felder an, die in die Ergebnisse aufgenommen werden sollen. Wenn nicht angegeben, werden alle Felder zurückgegeben.

            Beispiel: Zurückgeben bestimmter Felder

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

            Diese Abfrage gibt nur die Name- und CreatedDate für jeden Datensatz zurück.

            Dieser Parameter ist optional.

          • Seitengröße: Legt die Anzahl der Datensätze pro Abfrage fest. Die Standardanzahl der Datensätze pro Abfrage beträgt 25 und die maximale Anzahl 1.000.

            Beispiel: Benutzerdefinierte Seitengröße

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

            Diese Abfrage gibt 100 Datensätze pro Seite zurück.

            Hinweis
            Hinweis Wenn Sie 1.000 Datensätze in Ihrer Abfrage überschreiten, wird ein Laufzeitfehler ausgelöst.
            Dieser Parameter ist optional.
          • Sortierrichtung: Sortiert die Ergebnisse nach einem Feld wie CreatedDate.
            • Aufsteigend (asc): Älteste zu Neueste.
            • Absteigend (desc): Von Neuest zu Ältester.

              Beispiel: Sortierabfrage

              SortingDirection sortingDirection = new SortingDirection('desc');

              Diese Abfrage gibt Datensätze in absteigender Reihenfolge sortiert nach ihrer CreatedDate zurück.

              Dieser Parameter ist optional.

          getNextPage Methode

          Wenn die Ergebnisse nicht alle auf dieselbe Seite passen, ruft diese Methode die nächste Seite auf.

          ScrollId Parameter

          Verwenden Sie die Paginierung, um große Datensets zurückzugeben, indem Sie Ergebnisse auf Seiten mit bis zu 1.000 Datensätzen abrufen.

          Führen Sie zum Einrichten des Paginierungs-Workflows die anfängliche Abfrage aus, verwenden Sie die scrollId aus der Antwort, um nachfolgende Seiten abzurufen, und fahren Sie bis zum scrollId = '-1'. fort.

          Beispiel: Abrufen von Ergebnissen mit Paginierung

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

          Zugreifen auf die Methoden

          Navigieren Sie zum Suchen der Methodensignaturen unter "Setup" zu Apex Classes (Apex-Klassen). Öffnen Sie die ArchiverAccessor-Klasse. Suchen Sie alle Methoden, die unter dem performArchiverGlobalSearch-Namespace aufgeführt sind.

          Beispieldatenabfrage

          In diesem Beispiel werden Account unter Verwendung der folgenden Bedingungen abgerufen.

          • Felder: Name, CreatedDate
          • Obergrenze: 100 Datensätze pro Seite
          • Name: Enthält die Zeichenfolge "test"
          • Sortierung: Absteigend nach 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);
                      

          Fehlerbehebung bei häufigen Fehlern

          Fehlercode Beschreibung Lösung
          INTERNAL_ERROR Ein unerwarteter Fehler ist aufgetreten. Wenden Sie sich mit Fehlerdetails an den Support.
          RESOURCE_LIMIT_ERROR Obergrenzen für Paginierung oder Abfragegröße überschritten. Reduzieren Sie die Seitengröße oder optimieren Sie Suchfilter.
          VALIDATION_ERROR Fehlende oder ungültige Suchkriterien. Stellen Sie sicher, dass alle Felder und Filter gültig sind.

          Zusätzliche Empfehlungen

          • Überwachen Sie Ihre API-Nutzung, um zu vermeiden, dass Obergrenzen erreicht werden.
          • Wenn Sie die Antwort auf ein Objekt ausgeben möchten, serialisieren Sie es in JSON und deserialisieren Sie es dann wieder in ein Objekt.
          • Überprüfen Sie, ob Felder aktiviert und zugänglich sind.
          • Überprüfen Sie alle Abfrageparameter.
          • Wenden Sie sich bei ungelösten Problemen mit ausführlichen Protokollen an den Salesforce-Support.

          Schrittweise Testverfahren finden Sie unter Archivieren Apex Tests.

          Archivieren von Apex-Datenabfragen – Codebeispiel

          In diesem Codebeispiel werden ein Filter, ein Datumsbereich und eine Archivsuchanforderung über den Statuscode in der Archivanwendung validiert.

          Ein getNextPage nach der (scrollId != -1) ist enthalten, da die Größe der Ergebnisse im performArchiverGlobalSearch begrenzt ist.

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

          Archivieren von Apex-Datenabfragen – Beispielanwendungsfall 1

          In diesem Beispielanwendungsfall wird gezeigt, wie Sie eine Komponente erstellen und anpassen, die Accounts mit hoher Priorität in der Anwendung "Archivieren" anzeigt.

          Anwendungsfall

          Für Ihr Unternehmen muss das Tier-3-Supportteam über Zugriff zum Anzeigen archivierter Kundenvorgänge mit hoher Priorität verfügen.

          In diesem Beispiel wird gezeigt, wie:

          • Erstellen Sie eine benutzerdefinierte Lightning Web-Komponente.
          • Rufen Sie archivierte Daten mithilfe von Apex-Datenabfragen ab.
          • Wenden Sie den Filter an (Hohe Priorität).
            Hinweis
            Hinweis Andere Filter können angepasst werden, indem Sie auf den Code unter Archivieren von Apex-Datenabfragen – Codebeispiel verweisen.

            Dieses Beispiel ist auf 25 Datensätze begrenzt. Mit Apex können Sie die Ergebnisse auf 1.000 pro Seite festlegen. Die Standardeinstellung lautet 25, wobei die Paginierung durch die Ergebnisse möglich ist.

          Komponente, die Kundenvorgänge mit hoher Priorität anzeigt

          Beispiel für "SdkUseCaseWidget.js"

          In diesem Codebeispiel lautet der 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;
              }}
          }            

          Beispiel-SdkUseCaseWidget.html

          Das vom LWC verwendete Apex-Steuerfeld ruft Apex-Datenabfragen auf.

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

          Dies ist der Aufruf zum Archivieren von Apex. Sie enthält die folgenden Parameter.

          • sObjectName: Zeigt die Suche an
          • Filter: Wird zum Abrufen der Daten verwendet
          • Felder: Die projizierten Felder, die aus Daten zurückgegeben werden sollen.
          • Bereich: Der zum Abfragen der Daten verwendete Datumsbereich.
          <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

          Dieser Codeblock ist das Apex Steuerfeld.

          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

          Hilfsklasse zum Formulieren einer Klasse von Apex zu 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;
          }}

          Im obigen Code wird ein Beispielszenario beschrieben, in dem Sie LWC als Komponente zur Lightning-Seite hinzufügen können.

          Fügen Sie der sampleSdkUseCaseWidget.js-meta.xml-Datei diesen Code hinzu, um die tatsächliche Lightning-Datentabelle anzuzeigen. Fügen Sie dann der Lightning-Seite die Komponente Archivieren hinzu.

          <?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>

          Archivieren von Apex-Datenabfragen – Beispielanwendungsfall 2

          In diesem Beispielanwendungsfall wird gezeigt, wie Apex archivieren Aufgaben verarbeitet, ohne Obergrenzen wie CPU-Obergrenzen oder Timeout-Callouts in der Archivierungsanwendung zu überschreiten.

          Weitere Informationen finden Sie unter Apex Governor Limits.

          Anwendungsfall

          Für Ihr Unternehmen muss das Tier-3-Supportteam über Zugriff zum Anzeigen archivierter Kundenvorgänge mit hoher Priorität verfügen.

          In diesem Beispiel wird gezeigt, wie ein Fehler umgangen werden kann, wenn die Anzahl der über Apex abgerufenen archivierten Datensätze zu groß ist. Der Fehler lautet: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time allotted for callout, please contact support hinzu.

          Code aus diesen Apex Klassen erstellt diesen Anwendungsfall.

          Die ArchiveSecondPageJob-Klasse verarbeitet paginierte Daten aus dem Archiv mithilfe einer Bildlauf-ID und nimmt bei Bedarf Callouts vor. Sie wird asynchron über die Queueable-Schnittstelle ausgeführt, verfolgt die Gesamtausführungszeit, um Obergrenzen zu vermeiden, und stellt sich bei Bedarf in die Warteschlange für die weitere Verarbeitung. Die Klasse verarbeitet Antworten, aktualisiert die Bildlauf-ID und protokolliert Details zu jeder abgerufenen Datenseite.

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

          Die ArchiveSearch-Klasse führt eine Suche für das Kundenvorgangsobjekt mithilfe spezifischer Filter durch, ruft die Ergebnisse ab und protokolliert Details wie die Gesamtanzahl und die Bildlauf-ID. Wenn die Suche eine gültige Bildlauf-ID zurückgibt, die weitere Seiten mit Ergebnissen angibt, wird die archiveSecondPageJob in die Warteschlange gestellt, um die nächste Seite asynchron zu verarbeiten. Diese Klasse initiiert im Wesentlichen die Suche und übergibt die Weiterverarbeitung an die zuvor definierte archiveSecondPageJob.

          Im Folgenden finden Sie das Format für den anfänglichen Suchaufruf.

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

          Weitere Informationen finden Sie im Salesforce Apex Developer Guide.

           
          Laden
          Salesforce Help | Article