Salesforce - Apex - Comptes de requête basés sur l'historique des activités
-
23-12-2019 - |
Question
Hey Salesforce Experts,
J'ai une question sur les informations du compte de requête efficacement.Je voudrais interroger des comptes basés sur les mises à jour d'un objet d'activitéHistoire.Le problème que je reçois, c'est que tous les comptes sont résolus, peu importe s'il y a "complet" actifhistoire ou non.Ainsi, est-ce que je peux écrire cette requête pour récupérer uniquement des comptes avec unehistory actif qui a Statut="Terminer" et 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
];
La solution
Vous avez une clause WHERE sur les histoires, mais vous manquez toujours un sur le niveau du compte.
Par exemple, cela ne renvoignerait que des comptes contenant des contacts:
SELECT Id, Name
FROM Account
WHERE Id IN (SELECT AccountId FROM Contact) // try with NOT IN too
Avec des activités, il est plus difficile, car ils n'aiment pas être utilisés là où.
Les objets suivants ne sont actuellement pas pris en charge dans les sous-requêtes:
- ActivitéShistory
- Pièces jointes
- événement
- Eventattossee
- note
- Openactivité
- Tags (CompteTag, ContactTag et tous les autres objets de tag)
- tâche
En outre, l'imprimé fin au bas de ActivityShistory La définition est également un peu décourageant.
- Dans la clause principale de la requête de la relation, vous pouvez vous référer uniquement un enregistrement. Par exemple, vous ne pouvez pas filtrer sur tous les enregistrements où le Le nom du compte commence par 'A'; Au lieu de cela, vous devez faire référence à un seul Enregistrement de compte.
- Vous ne pouvez pas utiliser où les clauses.
- Vous devez spécifier une limite de 499 ou moins sur le nombre de lignes retournées dans la liste.
- Vous devez trier sur ActivitésDate dans l'ordre croissant et lastmodifieddate dans l'ordre décroissant; Vous pouvez afficher les NULLS en dernier. Pour Exemple: Ordre par ActivityDate ASC NULLS DERNIER, LastModifiedDate Desc.
On dirait que vous aurez besoin de plusieurs requêtes. Allez pour tâche (ou événement, selon lequel le champ personnalisé est visible), composez un ensemble de comptes de certification, puis interrogeez les comptes?
ou vous pouvez filtrer manuellement sur la liste de votre requête d'origine, copier des comptes à la liste desiliaires:
List<Account> finalResults = new List<Account>();
for(Account a : [SELECT...]){
if(!a.ActivityHistories.isEmpty()){
finalResults.add(a);
}
}