Olet tässä:
Apex arkistointipyynnöt
Arkistoi Apex -kyselyt sallivat arkistoidun datan ohjelmallisen käytön Arkistoi-sovelluksessa. Nämä datakyselyt automatisoivat liiketoimintaprosesseja, tukevat kolmansien osapuolten järjestelmäintegraatioita, luovat mukautettuja näkymiä ja raportteja sekä ristiviittaavat arkistoitua dataa aktiivisten tietueiden kanssa.
Arkistoi- ja Arkistoi haku -komponentit tarjoavat vaihtoehtoja datan manuaaliseen noutamiseen. Apex tarjoaa edistyneitä ominaisuuksia, kuten kyselyparametrejä, suodattimia ja sivutusta, jotta voit käyttää dataa suoraan koodilla.
Apex Data Query -ominaisuuksiin sisältyy:
- Hae arkistoituja tietueita käyttämällä määritettyjä ehtoja.
- Käytä osittaista vastaavuutta tähtimerkin kanssa (*).
- Palauta suuria datajoukkoja enintään 1 000 tietueen erissä per sivu.
- Käytä enintään kuutta suodatinta tarkentaaksesi tuloksiasi.
Nämä järjestelmään liittyvät Salesforce-objektit suodatetaan pois, eikä niitä voi hakea Apexissa.
FeedHistoryRelationShare
Arkistoi ei sisällä näitä objekteja hakuista, jotta voit ylläpitää optimaalista suorituskykyä ja varmistaa, että vain asiaankuuluvia arkistoituja tietoja palautetaan.
Käytä Arkistoi-komponenttia tai Arkistoi haku -komponenttia käyttääksesi arkistoituja tiedostoja.
Arkistoi Apex kyselymetodit
Määritä arkistoidun datan kyselytapa määrittämällä Apexin tarjoama arkistointimenetelmä.
- Arkistointidatan käyttäminen —
ArchiverAccessor-metodit on suunniteltu vuorovaikuttamaan arkistoitujen tietueiden kanssa. Sen jälkeen voit luoda kyselyitä ja hakea arkistoituun tuotteeseen tallennettua dataa. - Kyselytoimintojen määrittäminen — Nämä allekirjoitukset kertovat sinulle, millaisia kyselyitä voit suorittaa Apexilla, kuten globaaleja hakuja ja suodatettuja kyselyitä.
- Ohjaava käyttö — Tutkimalla metodin allekirjoituksia kehittäjät voivat ymmärtää toteutuksilleen tarvittavat input- ja output-arvot.
performArchiverGlobalSearch-metodi
Tämä menetelmä osoittaa, miten globaali haku voidaan suorittaa arkistoidulle datalle.
Query-parametrit
Apex käyttävät useita parametrejä hakuasi tarkentamiseen. Jotkin parametrit ovat pakollisia, kun taas toiset ovat valinnaisia. Jokaisen parametrin määrittämisen ymmärtäminen auttaa sinua saamaan tarkempia ja relevantteja tuloksia.
- Objektin nimi — Määrittää kyseltävän Salesforce-objektin tyypin.
Esimerkiksi
string sObjectName = 'Account'määrittää, että kysely kohdistaa tilitietueisiin.Tämä parametri on pakollinen.
Huomautus Jokainen kysely kohdistetaan yhteen objektiin. Käytä erillisiä kyselyitä noutaaksesi dataa useista objekteista. - Hakusuodattimet — Suodattimet, jotka rajoittavat hakutuloksia kenttien ehtojen perusteella.
- Kentän nimi — Kenttä, jonka perusteella haluat suodattaa, kuten
NametaiCreatedDate - Arvo tai Arvojen luettelo — Tietty arvo tai arvot, joita haluat täsmätä
Esimerkki: Yksittäisen arvon suodatin
SF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Name', 'test');Tämä kysely palauttaa tietueet, joiden Nimi-kenttä vastaa merkkijonoa "test".
Esimerkki: Useiden arvojen suodatinSF_Archive.SearchFilter filter = new SF_Archive.SearchFilter('Status', new List<String>{'Open', 'Closed'});Tämä kysely palauttaa tietueet, joiden Tila-kenttä vastaa merkkijonoa "Avoin" tai "Suljettu".
Tyhjien arvojen tai null-arvojen käsittely — Jos haluat hakea tietueita, joiden kenttä on tyhjä tai null, voit lisätä Arvojen luetteloon tyhjän merkkijonon ("").Esimerkki:
Tämä kysely palauttaa tapaustietueet, joiden Aihe-kenttä on joko tyhjä tai null.List<SearchFilter> filters = new List<SearchFilter>(); filters.add(new SearchFilter('Subject', ''));Hakusuodattimien rajoitukset:
- Kyselyillä täytyy olla vähintään 1 suodatin per kysely.
- Kyselyillä voi olla enintään 6 suodatinta, yhdistettynä
AND-logiikkaan, per kysely. - Suodattimet yhdistetään käyttämällä oletusarvoisesti
AND-logiikkaa.OR-logiikkaa ei tueta tällä hetkellä. - Suodattimen arvojen luettelo ei voi olla yli 1 000 kohdetta.
Tämä parametri on pakollinen.
- Kentän nimi — Kenttä, jonka perusteella haluat suodattaa, kuten
- Päivämääräsuodattimet — Jos haluat hakea päivämäärien perusteella, käytä
DateRange-parametriä ja pakollisia suodattimia.DateRangesuodattaa tietueita niiden kenttien perusteella, kutenArchiveDate,CreatedDatetaiModifiedDate.Esimerkki: Tietyn päivämäärän kyselyn päivämääräsuodatin
Date todayDate = Date.today(); Date jan1st2024 = Date.newInstance(2024, 1, 1); DateRange dateRange = new DateRange('archive_date', jan1st2024, todayDate);Tämä kysely palauttaa 1. tammikuuta 2024 ja tämänhetkisen päivän välisenä aikana arkistoidut tietueet.
Esimerkki: Usean ajanjakson päivämääräsuodatin
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);Tämä kysely palauttaa 12. joulukuuta 2023 ja 11. tammikuuta 2024 välisenä aikana arkistoidut tietueet.
Suositellut päivämääräsuodattimet:
- Jos haluat hakea arkistointipäivän perusteella, lisää
archive_date-päivämääräkenttä. - Käytä Apex: KK/PP/VVVV.
Tämä parametri on valinnainen.
- Jos haluat hakea arkistointipäivän perusteella, lisää
- Palautetut kentät — Määritä tuloksiin sisällytettävät kentät. Jos arvoa ei ole määritetty, kaikki kentät palautetaan.
Esimerkki: Palauta tietyt kentät
List<string> fields = new List<string>{'Name', 'CreatedDate'};Tämä kysely palauttaa vain kunkin tietueen
Name- jaCreatedDate-kentät.Tämä parametri on valinnainen.
- Sivun koko — Määrittää tietueiden määrän per kysely. Tietueiden oletusarvoinen määrä per kysely on 25, ja enimmäismäärä on 1 000.
Esimerkki: Mukautetun sivun koko
SF_Archive.ArchiverAccessorResponse res = SF_Archive.ArchiverAccessor.performArchiverGlobalSearch('Account', filters, 100, fields);Tämä kysely palauttaa 100 tietuetta per sivu.
Tämä parametri on valinnainen.Huomautus Jos kyselysi sisältää yli 1 000 tietuetta, käynnistyy suorituksen aikainen virhe. - Lajittelusuunta — Lajittelee tulokset kentän mukaan, kuten
CreatedDate.- Nouseva (
asc): Vanhimmasta uusimpaan. - Laskeva (
desc): Uusimmasta vanhimpaan.Esimerkki: Lajittelukysely
SortingDirection sortingDirection = new SortingDirection('desc');Tämä kysely palauttaa tietueet, jotka on lajiteltu laskevassa järjestyksessä niiden
CreatedDateperusteella.Tämä parametri on valinnainen.
- Nouseva (
getNextPage-metodi
Jos tulokset eivät mahdu samaan sivuun, tämä menetelmä kutsuu seuraavaa sivua.
ScrollId-parametri
Käytä sivutusta palauttaaksesi suuria datajoukkoja noutamalla tuloksia enintään 1 000 tietueen sivuilta.
Määritä sivutustyönkulku suorittamalla alustava kysely, käyttämällä vastauksesta saatuja scrollId-arvoja noutaaksesi myöhempiä sivuja ja jatkaaksesi scrollId = '-1'..
Esimerkki: Tulosten noutaminen sivutuksella
// 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);
}Metodien käyttäminen
Löydät metodin allekirjoitukset Määritykset-valikon Apex. Avaa ArchiverAccessor-luokka. Etsi kaikki performArchiverGlobalSearch-nimitilan alla olevat metodit.
Esimerkki datakyselystä
Tämä esimerkki noutaa Account-tietueet käyttämällä seuraavia ehtoja.
- Kentät:
Name,CreatedDate - Rajoitus: 100 tietuetta per sivu
- Nimi: Sisältää merkkijonon "test"
- Lajittelu: Laskeva
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);
Yleisten virheiden vianmääritys
| Virhekoodi | Kuvaus | Ratkaisu |
|---|---|---|
INTERNAL_ERROR |
Odottamaton virhe tapahtui. | Ota yhteyttä tukeen virheiden lisätiedoilla. |
RESOURCE_LIMIT_ERROR |
Ylitetty sivutuksen tai kyselyn kokorajoitukset. | Vähennä sivun kokoa tai tarkenna hakusuodattimia. |
VALIDATION_ERROR |
Hakuehdot puuttuvat tai virheellisiä. | Varmista, että kaikki kentät ja suodattimet ovat käypiä. |
Muita suosituksia
- Valvo API:n käyttöäsi välttyäksesi rajoitusten ylittymiseltä.
- Jos haluat lähettää vastauksen objektiin, sarjaa se JSON-tiedostoon ja poista sitten sarjanpito takaisin objektiksi.
- Varmista, että kentät ovat käytössä ja käytettävissä.
- Tarkasta kaikki kyselyparametrit.
- Jos sinulla on ratkaisemattomia ongelmia, ota yhteyttä Salesforce-tukeen yksityiskohtaisten lokien avulla.
Katso vaiheittaiset testaustoimenpiteet kohdasta Apex-testauksen arkistointi.
- Apex arkistointipyynnöt — Esimerkkikoodi
Tässä esimerkkikoodissa suodatin, ajanjakso ja arkiston hakupyyntö vahvistetaan Arkistoi-sovelluksen tilakoodin kautta. - Apex arkistointipyynnöt — Esimerkki käyttötarkoituksesta 1
Tämä käyttöesimerkki osoittaa, miten voit rakentaa ja mukauttaa komponenttia, joka näyttää High Priority Accounts -objektin Arkistoi-sovelluksessa. - Apex arkistointipyynnöt — Esimerkki käyttötarkoituksesta 2
Tämä käyttöesimerkki osoittaa, miten Arkistoi Apex käsittelee tehtäviä ylittämättä hallintarajoituksia, kuten CPU-rajoituksia tai Timeout-kutsuja Arkistoi-sovelluksessa.
Apex arkistointipyynnöt — Esimerkkikoodi
Tässä esimerkkikoodissa suodatin, ajanjakso ja arkiston hakupyyntö vahvistetaan Arkistoi-sovelluksen tilakoodin kautta.
(scrollId != -1) seuraava getNextPage sisällytetään mukaan, koska tulosten koko on rajoitettu performArchiverGlobalSearch-kutsussa.
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 arkistointipyynnöt — Esimerkki käyttötarkoituksesta 1
Tämä käyttöesimerkki osoittaa, miten voit rakentaa ja mukauttaa komponenttia, joka näyttää High Priority Accounts -objektin Arkistoi-sovelluksessa.
Käyttötarkoitus
Yrityksesi vaatii, että tason 3 tukitiimillä on korkean prioriteetin tilan arkistoitujen tapausten tarkasteluoikeus.
Tämä esimerkki osoittaa, miten voit:
- Luo mukautettu Lightning (LWC).
- Nouda arkistoitua dataa käyttämällä Apex.
- Käytä suodatinta (korkea prioriteetti). Huomautus Muita suodattimia voidaan mukauttaa käyttämällä Apex arkistointikyselyt -osiossa olevaa koodia — esimerkki koodista.
Tämä esimerkki on rajoitettu 25 tietueeseen. Apex sallii sinun asettaa tuloksiin 1 000 per sivu. Oletusarvo on 25, ja voit valita sivutuksen tulosten läpi.
Korkean prioriteetin tapaukset näyttävä komponentti
Esimerkki SdkUseCaseWidget.js
Tässä esimerkkikoodissa parametri on 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;
}}
} Esimerkki SdkUseCaseWidget.html
LWC:n käyttämä Apex kutsuu Apex.
SF_Archive.ArchiverAccessor.performArchiverGlobalSearch(sObjectName, request, fields, range);Tämä on Arkistoi Apex -kutsu. Se sisältää seuraavat parametrit.
- sObjectName — Kuvaa hakua
- Suodattimet — Käytetään datan noutamiseen
- Kentät — Datan palauttamat ennustetut kentät.
- Asteikko — Datan kyselemiseen käytetty ajanjakso.
<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
Tämä koodilohko on 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
Avustajan luokka, joka muotoilee luokan Apexista LWC:ään
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;
}}Yllä oleva koodi kuvaa esimerkkiskenaariota, jossa voit lisätä LWC:n komponenttina Lightning.
Jos haluat tarkastella todellista Lightning-datataulukkoa, lisää tämä koodi sampleSdkUseCaseWidget.js-meta.xml-tiedostoon. Lisää sitten Arkistoi-komponentti 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>Apex arkistointipyynnöt — Esimerkki käyttötarkoituksesta 2
Tämä käyttöesimerkki osoittaa, miten Arkistoi Apex käsittelee tehtäviä ylittämättä hallintarajoituksia, kuten CPU-rajoituksia tai Timeout-kutsuja Arkistoi-sovelluksessa.
Lisätietoja on kohdassa Apex-hallintarajoitukset.
Käyttötarkoitus
Yrityksesi vaatii, että tason 3 tukitiimillä on korkean prioriteetin tilan arkistoitujen tapausten tarkasteluoikeus.
Tämä esimerkki osoittaa, miten voit välttyä virheestä, kun Apexilla haettujen arkistoitujen tietueiden määrä on liian suuri. Virheessä lukee: SF_Archive.ArchiverAccessor.ArchiverAccessorException: Exceeded time
allotted for callout, please contact support.
Näiden Apex koodi luo tämän käyttötarkoituksen.
ArchiveSecondPageJob-luokka käsittelee arkistosta sivutettuja tietoja käyttämällä vierityksen tunnusta ja tekemällä callout-kutsuja tarvittaessa. Se suoritetaan asynkronisesti Queueable-käyttöliittymän kautta, se seuraa kokonaissuoritusaikaa rajoitusten ylittymisen välttämiseksi ja jatkaa käsittelyä tarvittaessa. Luokka käsittelee vastaukset, päivittää vierityksen tunnuksen ja kirjaa kunkin haetun datasivun tiedot lokiin.
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-luokka suorittaa haun Tapaus-objektille käyttämällä tiettyjä suodattimia, noutaa tulokset ja kirjaa lokiin lisätietoja, kuten kokonaismäärän ja vierityksen tunnuksen. Jos haku palauttaa kelvollisen vierityksen tunnuksen, joka osoittaa enemmän tulosten sivuja, se asettaa archiveSecondPageJob käsittelemään seuraavan sivun asynkronisesti. Tämä luokka käynnistää haun ja käsittelee aiemmin määritetyn archiveSecondPageJob.
Alla on alkuperäisen hakupuhelun muoto.
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);
}}}}Lisätietoja on kohdassa Salesforce Apex Developer Guide.

