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

Était-ce utile?

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ù.

http://www.salesforce.com/us/ Developer / Docs / OfficeToolKit / Contenu / sforce_api_calls_soql_select.htm

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.

Les restrictions suivantes sur les utilisateurs qui n'ont pas la permission "Afficher toutes les données" Aidez à prévenir les problèmes de performance:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top