Salesforce - Apex - query di account basati sulla Cronologia delle Attività
-
23-12-2019 - |
Domanda
Ehi Salesforce esperti,
Ho una domanda su query informazioni di account in modo efficiente.Vorrei query conti in base agli aggiornamenti in un activityHistory oggetto.Il problema che sto ottenendo è che tutti i conti sono recuperati, non importa se c'è "completo" activeHistory o non.Così, c'È un modo posso scrivere questa query per recuperare solo i conti con activeHistory che ha status="complete" e Type_for_reporting='QRC'?
List<Account> AccountsWithActivityHistories = [
SELECT
Id
,Name
,( SELECT
ActivityDate
,ActivityType
,Type_for_Reporting__c
,Description
,CreatedBy.Name
,Status
,WhatId
FROM ActivityHistories
WHERE Status ='complete' and Type_for_Reporting__c = 'QRC'
)
FROM Account
];
Soluzione
Hai una clausola WHERE sulle storie ma manca ancora uno a livello di Account.
Per esempio, questo sarebbe tornato solo Account Contatti:
SELECT Id, Name
FROM Account
WHERE Id IN (SELECT AccountId FROM Contact) // try with NOT IN too
Con Attività più complicata perché a loro non piace essere utilizzato in DOVE in quel modo.
http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm
I seguenti oggetti non sono attualmente supportati in subquery:
- ActivityHistory
- Allegati
- Evento
- EventAttendee
- Nota
- OpenActivity
- Tag (AccountTag, ContactTag, e tutti gli altri oggetti tag)
- Attività
Inoltre la stampa fine in fondo ActivityHistory la definizione è anche un po ' scoraggiante.
Le seguenti restrizioni per gli utenti che non hanno “Visualizza Tutti i Dati” autorizzazione aiutare a prevenire problemi di prestazioni:
- La clausola principale della query di relazione, si può fare riferimento solo un record.Per esempio, non è possibile filtrare tutti i record in cui il account ha il nome che inizia per ‘A’;invece, si deve fare riferimento a un singolo record di account.
- Non è possibile utilizzare la clausola WHERE.
- È necessario specificare un limite di 499 o meno il numero di righe restituite nell'elenco.
- È necessario ordinare ActivityDate in ordine crescente e LastModifiedDate in ordine decrescente;è possibile visualizzare i valori null ultimo.Per esempio:ORDINE ActivityDate ASC NULL ULTIMO, LastModifiedDate DESC.
Sembra che si avrà bisogno di più query.Andare per l'Attività (o di un Evento, a seconda, per cui il campo personalizzato è visibile), si compone di una serie di AccountIds e quindi interrogare i Conti?
O è possibile filtrare manualmente attraverso una lista di query originale, la copia dei conti agli helper elenco:
List<Account> finalResults = new List<Account>();
for(Account a : [SELECT...]){
if(!a.ActivityHistories.isEmpty()){
finalResults.add(a);
}
}